// 빌트인 렌더 파이프라인 이식판(삼국지 슬링샷 · 2026-11-09) — 원본 = WL 프로젝트 URP 셰이더 Eric VFX Studio/Resource/Shader/AdditiveFlow.shader (Eric/URP_AdditiveFlow) // GUID · 셰이더 이름 · 속성 이름을 원본과 같게 두어 WL 에서 옮겨 온 재질이 그대로 이 셰이더를 쓴다. 계산식 = 원본 Forward 패스 그대로(URP 함수 → UnityCG). Shader "Eric/URP_AdditiveFlow" { Properties { [MainTexture] _MainTex("Main Texture", 2D) = "white" {} [HDR] _TintColor("Tint Color", Color) = (1, 1, 1, 1) _FlowSpeed("MainTex Flow Speed", Vector) = (0, 0, 0, 0) _Brightness("Brightness Boost", Float) = 1.0 [Header(Soft Particles)] [Toggle(_SOFTPARTICLES_ON)] _SoftParticlesEnabled("Enable Soft Particles", Float) = 0 _SoftParticlesFadeDistance("Fade Distance", Range(0.01, 10.0)) = 1.0 [Header(UV Distortion)] _DistortionMap("Distortion Map", 2D) = "white" {} _DistortionPower("Distortion Power", Range(0, 1)) = 0 _DistortionSpeed("Distortion Speed", Vector) = (0, 0, 0, 0) [Header(Fresnel Rim Light)] [Toggle(_FRESNEL_ON)] _UseFresnel("Enable Fresnel", Float) = 0 [Enum(Normal Based, 0, UV Based, 1)] _FresnelType("Fresnel Type", Float) = 0 [HDR] _FresnelColor("Fresnel Color", Color) = (1, 1, 0, 1) _FresnelIntensity("Fresnel Intensity", Float) = 5.0 _FresnelWidth("Fresnel Width", Range(0.1, 15.0)) = 5.0 [Toggle(_FRESNEL_MASK_ON)] _FresnelMasksTexture("Use Fresnel as Texture Mask", Float) = 0 [Header(Dissolve)] [Toggle(_USEPARTICLEALPHADISSOLVE_ON)] _UseAlphaDissolve("Use Alpha as Dissolve", Float) = 0 _DissolveTex("Dissolve Texture", 2D) = "white" {} _DissolveAmount("Dissolve Amount", Range(0, 1)) = 0.0 _VertexAlphaRef("Alpha Ref", Range(0.01, 1.0)) = 1.0 [HDR] _DissolveEdgeColor("Dissolve Edge Color", Color) = (1, 0, 0, 1) _DissolveEdgeWidth("Dissolve Edge Width", Range(0, 0.2)) = 0.05 [Header(Overlay)] _OverlayTex("Overlay Texture", 2D) = "white" {} [HDR] _OverlayColor("Overlay Color", Color) = (1, 1, 1, 1) _OverlayFlowSpeed("Overlay Flow Speed", Vector) = (0, 0, 0, 0) [Header(Vertex Distort)] [Toggle(_VERTEX_DISTORT_ON)] _UseVertexDistort("Enable Vertex Distort", Float) = 0 _DistortStrength("Vertex Strength", Range(0, 0.5)) = 0.0 _DistortSpeed("Vertex Speed", Float) = 1.0 _DistortFrequency("Vertex Frequency", Float) = 2.0 } SubShader { Tags { "RenderType" = "Transparent" "Queue" = "Transparent" "IgnoreProjector" = "True" "PreviewType" = "Plane" } CGINCLUDE #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal : NORMAL; float4 color : COLOR; }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; float4 screenPos : TEXCOORD1; float3 normalWS : TEXCOORD3; float3 viewDirWS : TEXCOORD4; float4 color : COLOR; }; float4 _MainTex_ST, _DissolveTex_ST, _DistortionMap_ST, _OverlayTex_ST; float4 _TintColor, _FlowSpeed, _DistortionSpeed, _FresnelColor, _DissolveEdgeColor, _OverlayColor, _OverlayFlowSpeed; float _Brightness, _FresnelWidth, _FresnelIntensity, _DistortStrength, _DistortSpeed, _DistortFrequency, _DistortionPower, _DissolveAmount, _VertexAlphaRef, _DissolveEdgeWidth, _FresnelType, _SoftParticlesFadeDistance; sampler2D _MainTex, _DissolveTex, _DistortionMap, _OverlayTex; UNITY_DECLARE_DEPTH_TEXTURE(_CameraDepthTexture); v2f vert(appdata v) { v2f o; float3 wPos = mul(unity_ObjectToWorld, v.vertex).xyz; #ifdef _VERTEX_DISTORT_ON v.vertex.xyz += v.normal * sin(_Time.y * _DistortSpeed + (wPos.x + wPos.y + wPos.z) * _DistortFrequency) * _DistortStrength; #endif o.pos = UnityObjectToClipPos(v.vertex); o.screenPos = ComputeScreenPos(o.pos); COMPUTE_EYEDEPTH(o.screenPos.z); o.uv = v.uv; o.color = v.color; o.normalWS = UnityObjectToWorldNormal(v.normal); o.viewDirWS = _WorldSpaceCameraPos.xyz - wPos; return o; } float SoftFade(v2f i) { float softFade = 1.0; #ifdef _SOFTPARTICLES_ON float raw = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)); float sceneZ; if (unity_OrthoParams.w > 0.5) { #if defined(UNITY_REVERSED_Z) raw = 1.0 - raw; #endif sceneZ = lerp(_ProjectionParams.y, _ProjectionParams.z, raw); } else sceneZ = LinearEyeDepth(raw); softFade = saturate((sceneZ - i.screenPos.z) / max(0.01, _SoftParticlesFadeDistance)); #endif return softFade; } ENDCG Pass { Cull Off ZWrite Off Blend One One CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma shader_feature _SOFTPARTICLES_ON #pragma shader_feature _FRESNEL_ON #pragma shader_feature _FRESNEL_MASK_ON #pragma shader_feature _USEPARTICLEALPHADISSOLVE_ON #pragma shader_feature _VERTEX_DISTORT_ON float4 frag(v2f i) : SV_Target { float softFade = SoftFade(i); float2 uvOff = (tex2D(_DistortionMap, i.uv * _DistortionMap_ST.xy + _DistortionMap_ST.zw + _DistortionSpeed.xy * _Time.y).rg * 2.0 - 1.0) * _DistortionPower; float4 tex = tex2D(_MainTex, i.uv * _MainTex_ST.xy + _MainTex_ST.zw + _FlowSpeed.xy * _Time.y + uvOff); float4 over = tex2D(_OverlayTex, i.uv * _OverlayTex_ST.xy + _OverlayTex_ST.zw + _OverlayFlowSpeed.xy * _Time.y + uvOff) * _OverlayColor; float dAmt = _DissolveAmount; #ifdef _USEPARTICLEALPHADISSOLVE_ON dAmt = saturate(_DissolveAmount + (1.0 - saturate(i.color.a / max(0.001, _VertexAlphaRef)))); #endif float dVal = tex2D(_DissolveTex, i.uv * _DissolveTex_ST.xy + _DissolveTex_ST.zw).r; float bAC = step(0.001, tex.a); float dMask = step(dAmt, dVal) * bAC; float eMask = saturate(step(dAmt - _DissolveEdgeWidth, dVal) - step(dAmt, dVal)) * bAC * saturate(dAmt * 100.0); float3 rgb = tex.rgb * _TintColor.rgb * i.color.rgb * over.rgb * _Brightness; float alpha = tex.a * _TintColor.a * i.color.a * over.a * softFade; #ifdef _FRESNEL_ON float fPower = max(0.1, 15.1 - _FresnelWidth); float fNormal = pow(1.0 - saturate(abs(dot(normalize(i.normalWS), normalize(i.viewDirWS)))), fPower); float2 uvD = min(i.uv, 1.0 - i.uv); float fEff = lerp(fNormal, pow(saturate(1.0 - min(uvD.x, uvD.y) * 2.0), fPower), step(0.5, _FresnelType)); #ifdef _FRESNEL_MASK_ON rgb *= fEff; alpha *= fEff; #endif rgb += _FresnelColor.rgb * fEff * _FresnelIntensity; #endif float3 finalRGB = (rgb * dMask + _DissolveEdgeColor.rgb * eMask) * alpha; return float4(finalRGB, 1.0); } ENDCG } } }