// 빌트인 렌더 파이프라인 이식판(삼국지 슬링샷 · 2026-11-09) — 원본 = WL 프로젝트 URP 셰이더 ResWork/VFX/MasterStylizedFX/Shaders/CommonMesh.shader (CommonMesh2Side · Amplify) // GUID · 셰이더 이름 · 속성 이름을 원본과 같게 두어 WL 에서 옮겨 온 재질이 그대로 이 셰이더를 쓴다. 계산식 = 원본 Forward 패스 그대로(URP 함수 → UnityCG). Shader "CommonMesh2Side" { 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) = 1 [Header(StretchUV)]_StretchUVDes("StretchUVDes", Vector) = (0,0,0,0) _StretchMultiplier("StretchMultiplier", Vector) = (0,0,0,0) [Toggle]_Stretch("Stretch", Float) = 0 [Header(Mask)][NoScaleOffset]_NoiseMask("NoiseMask", 2D) = "white" {} [Toggle]_Mask("Mask", Float) = 1 _MaskScroll("MaskScroll", Vector) = (0,0,0,0) _MaskTiling("MaskTiling", Vector) = (0,0,0,0) _MaskOffset("MaskOffset", Vector) = (0,0,0,0) _Feather("Feather", Float) = 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" } Pass { Cull Off ZWrite Off ZTest LEqual Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma shader_feature_local _ALPHATEST_ON #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, _StretchUVDes, _StretchMultiplier, _MaskScroll, _MaskTiling, _MaskOffset; float _LimitUV, _Stretch, _Mask, _Feather; v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.color = v.color; o.uv0 = v.uv0; o.uv1 = v.uv1; return o; } float4 frag(v2f i) : SV_Target { float2 stretch = _Stretch > 0.5 ? (_StretchMultiplier.xy * (_StretchUVDes.xy - i.uv0.xy) * i.uv0.w) : float2(0, 0); float2 uv = i.uv0.xy * _Tiling.xy + ((i.uv0.z * _Scroll.xy) + _Offset.xy + stretch); 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 * _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); float alpha = (i.color.a * mainTex.a) * (_Mask > 0.5 ? noiseMask : 1.0) * staticMask; float3 rgb = (i.color * mainTex * (1.0 + i.uv1.x)).rgb; #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 검토) return float4(rgb, alpha); } ENDCG } } }