ThreeKingdomsSlingshot/Assets/VFX/_BuiltinPorts/CommonMeshLoop.shader

104 lines
5.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 빌트인 렌더 파이프라인 이식판(삼국지 슬링샷 · 2026-11-10) — 원본 = WL 프로젝트 URP 셰이더 ResWork/VFX/MasterStylizedFX/Shaders/CommonMeshLoop.shader (CommonMeshLoop · Amplify)
// GUID · 셰이더 이름 · 속성 이름을 원본과 같게 두어 WL 에서 옮겨 온 재질이 그대로 이 셰이더를 쓴다. 계산식 = 원본 ExtraPrePass(뒷면) + Forward(앞면) 그대로(URP 함수 → UnityCG · _TimeParameters.x → _Time.y)
// + TKS_HdrApprox.cginc(URP HDR 톤매핑 · 블룸 근사 — 1 넘는 밝기를 흰빛으로).
Shader "CommonMeshLoop"
{
Properties
{
[HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1)
[HideInInspector] _AlphaCutoff("Alpha Cutoff ", Range(0, 1)) = 0.5
[Header(Main)][NoScaleOffset]_Main("Main", 2D) = "white" {}
_Tiling("Tiling", Vector) = (1,1,0,0)
_Offset("Offset", Vector) = (0,0,0,0)
_Scroll("Scroll", Vector) = (1,0,0,0)
[Header(LimitUV)]_LimitUVRange("LimitUVRange", Vector) = (0,1,0,1)
[Toggle]_LimitUV("LimitUV", Float) = 0
[Header(Mask)][NoScaleOffset]_NoiseMask("NoiseMask", 2D) = "white" {}
[Toggle]_Mask("Mask", Float) = 1
_MaskTiling("MaskTiling", Vector) = (0,0,0,0)
_MaskOffset("MaskOffset", Vector) = (0,0,0,0)
_MaskScroll("MaskScroll", Vector) = (0,0,0,0)
_Feather("Feather", Range(0, 1)) = 0
[Header(StaticMask)]_StaticMask("StaticMask", 2D) = "white" {}
_SmoothStep("SmoothStep", Vector) = (0,1,0,0)
[HideInInspector] _texcoord("", 2D) = "white" {}
[HideInInspector] _QueueOffset("_QueueOffset", Float) = 0
[HideInInspector] _QueueControl("_QueueControl", Float) = -1
}
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" "IgnoreProjector" = "True" }
CGINCLUDE
#include "UnityCG.cginc"
#include "TKS_HdrApprox.cginc"
struct appdata { float4 vertex : POSITION; float4 color : COLOR; float4 uv0 : TEXCOORD0; float4 uv1 : TEXCOORD1; };
struct v2f { float4 pos : SV_POSITION; float4 color : COLOR; float4 uv0 : TEXCOORD0; float4 uv1 : TEXCOORD1; };
sampler2D _Main, _NoiseMask, _StaticMask;
float4 _StaticMask_ST, _LimitUVRange, _SmoothStep;
float4 _Tiling, _Offset, _Scroll, _MaskScroll, _MaskTiling, _MaskOffset;
float _LimitUV, _Mask, _Feather;
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.color;
o.uv0 = float4(v.uv0.xyz, 0);
o.uv1 = v.uv1;
return o;
}
float4 fragCommon(v2f i)
{
float2 uv = i.uv0.xy * _Tiling.xy + (((i.uv0.z * _Scroll.xy) * _Time.y) + _Offset.xy);
float2 uvc = clamp(uv, float2(_LimitUVRange.x, _LimitUVRange.z), float2(_LimitUVRange.y, _LimitUVRange.w));
float4 mainTex = tex2D(_Main, _LimitUV > 0.5 ? uvc : uv);
float lr = lerp(0.0 - _Feather, 1.0 + _Feather, i.uv1.z);
float2 maskUV = i.uv0.xy * _MaskTiling.xy + (_MaskOffset.xy + ((i.uv1.w * _Time.y) * _MaskScroll.xy));
float noiseMask = smoothstep(lr - _Feather, lr + _Feather, tex2D(_NoiseMask, maskUV).r);
float2 uvStatic = i.uv0.xy * _StaticMask_ST.xy + _StaticMask_ST.zw;
float staticMask = smoothstep(_SmoothStep.x, _SmoothStep.y, tex2D(_StaticMask, uvStatic).r);
float3 rgb = (i.color * mainTex * (1.0 + i.uv1.x)).rgb;
float alpha = (i.color.a * mainTex.a) * (_Mask > 0.5 ? noiseMask : 1.0) * staticMask;
#ifdef _ALPHATEST_ON
clip(alpha - 0.5);
#endif
float hot;
rgb = TKS_HotToWhite(rgb, hot); // URP HDR 톤매핑·블룸 근사(TKS_HdrApprox.cginc)
alpha = TKS_CelAlpha(saturate(alpha * (1.0 + hot))); // 불투명도 3단계(셀 · 2026-11-10 Fable 검토)
#ifdef _ALPHAPREMULTIPLY_ON
rgb *= alpha;
#endif
return float4(rgb, alpha);
}
ENDCG
Pass
{
Name "ExtraPrePass"
Cull Front ZWrite Off ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local _ALPHATEST_ON
#pragma shader_feature_local _ALPHAPREMULTIPLY_ON
// 뒷면 셸 = 같은 색을 어둡게(그늘 테두리 · 2026-11-10 Fable 검토 「어두운 림」 → 고정 갈색은 셸 아래 검은 얼룩으로 보여(실측) 진영색 × TKS_RIM_SHADE 로 · 원본 = 같은 색 그대로)
float4 frag(v2f i) : SV_Target { float4 c = fragCommon(i); return float4(c.rgb * TKS_RIM_SHADE, c.a * TKS_RIM_ALPHA); }
ENDCG
}
Pass
{
Name "Forward"
Cull Back ZWrite Off ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local _ALPHATEST_ON
#pragma shader_feature_local _ALPHAPREMULTIPLY_ON
float4 frag(v2f i) : SV_Target { return fragCommon(i); }
ENDCG
}
}
}