ThreeKingdomsSlingshot/Assets/VFX/_BuiltinPorts/AdditiveFlow.shader

138 lines
7.4 KiB
Plaintext
Raw Permalink Normal View History

스킬 이펙트 작업 준비 — 스킬 테스트 씬 · WL 이펙트 이식 · 이펙트 표 · 보병·창·기병 슬링샷 공격 = WL 창 돌진 이펙트 시험(PD 2026-11-09) PD 「WL 프로젝트에서 스킬을 구현하던 방식과 동일하게 유닛 별 스킬 구현」 · 「테스트 목적: 보병, 창, 기병을 슬링샷으로 공격할 때 WL 창 돌진 공격 이펙트」 - 스킬 테스트 씬 Assets/Scenes/SkillTest.unity(SkillTestBootstrap · 메뉴 TKS/Skill Test/Build Scene): 영웅 목록 선택(heroes.csv 56) · 더미(죽지 않음 · 행동 토글 · 배치 표 Resources/Skills/skill_test.csv) · 슬링샷 · 액티브 버튼 · 쿨 무시 · 영웅 무적 · 이펙트 보기(에디터 · Assets/VFX 검색 → 영웅에 띄움) - 이펙트 표 Resources/Skills/skill_vfx.csv → Runtime/Skills/SkillVfx(키 = 스킬 id 또는 basic_<병종> · cast/travel/hit · f_every 반복 · 사본 Resources/Fx/TKS_Fx_*) · 훅 = SkillSystem Announce/BeginAction/EndAction/Hit/Instant - WL 이펙트 이식 Assets/VFX(약 640 MB · 빌트인 호환분만 · GUID 유지 · 도구 Tools/wl_vfx_import.py) · URP 셰이더 빌트인 이식 4종 Assets/VFX/_BuiltinPorts · com.unity.shadergraph 17.3.0 · 카메라 깊이 텍스처 켬(셰이더 그래프 소프트 파티클) - 시험: basic_infantry/spear/cavalry travel = TKS_Fx_SpearRush · SpearRushWrap · SpearRushDust(WL WLStaffEarth rushFx 1~3 값 환산) — 표 9행 삭제 = 원래대로 - 테스트 118/118 · console error 0 · 이 PC 첫 임포트 자동 재직렬화(png·tga .meta · UITheme · ProjectSettings · InputManager)는 제외 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 14:12:52 +00:00
// 빌트인 렌더 파이프라인 이식판(삼국지 슬링샷 · 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
}
}
}