新增回声扩散特效

This commit is contained in:
2026-07-06 13:43:09 +08:00
parent 11f04b2ac8
commit 5771d9157e
5 changed files with 241 additions and 4 deletions
@@ -0,0 +1,92 @@
Shader "IndianOcean/EchoRing"
{
// 回声红圈 Shader —— 配合 EchoSystem 使用
// 在地面(XZ平面)上绘制一个红色渐变圆环,圆环位置跟随全局 _EchoRadius
// 边缘使用 smoothstep 渐变,从圆环中心满透明度向两侧柔和消散
Properties
{
_RingColor ("Ring Color", Color) = (1, 0.15, 0.1, 1)
_RingWidth ("Ring Width (world units)", Float) = 2.5
}
SubShader
{
Tags
{
"RenderType" = "Transparent"
"Queue" = "Transparent+250"
"RenderPipeline" = "UniversalPipeline"
}
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
ZTest Always
Cull Off
Pass
{
Name "EchoRing"
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float3 worldPos : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
CBUFFER_START(UnityPerMaterial)
float4 _RingColor;
float _RingWidth;
CBUFFER_END
// 全局回声参数(由 EchoSystem 通过 Shader.SetGlobalX 设置)
float4 _EchoCenter; // xy = 回声中心世界坐标 XZ
float _EchoRingRadius; // 红圈独立扩散半径
float _EchoRingAlpha; // 红圈独立透明度(独立于描边强度)
Varyings vert(Attributes input)
{
Varyings output;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_TRANSFER_INSTANCE_ID(input, output);
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.worldPos = TransformObjectToWorld(input.positionOS.xyz);
return output;
}
half4 frag(Varyings input) : SV_Target
{
// 世界空间 XZ 平面上的距离
float2 wp = input.worldPos.xz;
float dist = distance(wp, _EchoCenter.xy);
// 距离圆环中心的偏差
float distFromRing = abs(dist - _EchoRingRadius);
// 渐变:圆环中心满强度,两侧柔和消散
float halfW = max(0.001, _RingWidth * 0.5);
float alpha = 1.0 - smoothstep(0.0, halfW, distFromRing);
// 乘以红圈独立透明度(独立于描边消散时序)
alpha *= _EchoRingAlpha;
if (alpha < 0.001) discard;
return half4(_RingColor.rgb, alpha * _RingColor.a);
}
ENDHLSL
}
}
FallBack Off
}