Shader "Custom/Shield"
{Properties{_Size("Size", Range(0 , 10)) = 1 // 控制噪聲紋理縮放大小的參數_colorPow("colorPow", Float) = 1 // 控制顏色強度的指數_colorMul("colorMul", Float) = 1 // 控制顏色乘法因子_mainColor("mainColor", Color) = (1,1,1,0) // 主顏色_Noise1Tex("Noise1Tex", 2D) = "white" {} // 噪聲紋理_dir1("dir1", Vector) = (0,0,0,0) // 流動方向1_dir2("dir2", Vector) = (1,1,0,0) // 流動方向2_alphaSpeed("alphaSpeed", Float) = 1 // 控制透明度變化速度的參數_colorAdd("colorAdd", Float) = 1 // 控制顏色添加因子_flowSpeed("flowSpeed", Float) = 1 // 控制流動速度的參數_flowStrength("flowStrength", Vector) = (1,1,0,0) // 控制流動強度的參數}SubShader{Tags { "RenderType"="Opaque" }Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha // 混合模式:源顏色的 alpha 與目標顏色的反 alpha 進行混合ZWrite Off // 關閉深度寫入LOD 100 // 設置 LOD 等級Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag #include "UnityCG.cginc"struct appdata{float4 vertex : POSITION; // 頂點位置float2 uv : TEXCOORD0; // 紋理坐標};struct v2f{float2 uv : TEXCOORD0; // 傳遞給片段著色器的紋理坐標float4 vertex : SV_POSITION; // 傳遞給片段著色器的裁剪空間頂點位置};// Uniform 變量uniform float4 _mainColor;uniform sampler2D _Noise1Tex;uniform float4 _Noise1Tex_ST;uniform float _Size;uniform float3 _dir1;uniform float2 _flowStrength;uniform float _flowSpeed; uniform float _colorMul;uniform float _colorPow;uniform float3 _dir2;uniform float _colorAdd;uniform float _alphaSpeed;// Flow 函數:生成流動效果float3 Flow(sampler2D tex, float2 uv, float2 dir, float2 strength, float speed){float2 dirx = dir + 0.5f; // 調整方向float timeSpeed = _Time.y * speed; // 根據時間和速度計算流動的時間因子float2 uv1 = uv + (dirx * strength * frac(timeSpeed)); // 計算第一組紋理坐標float2 uv2 = uv + (dirx * strength * (frac(timeSpeed + 0.5f))); // 計算第二組紋理坐標float3 result = lerp(UnpackNormal(tex2D(tex, uv1)), UnpackNormal(tex2D(tex, uv2)), (abs((frac(timeSpeed) - 0.5)) / 0.5)); // 線性插值計算最終的流動效果return result;}v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex); // 轉換頂點位置到裁剪空間o.uv = TRANSFORM_TEX(v.uv, _Noise1Tex) / +_Size; // 計算紋理坐標并進行縮放return o;}half4 frag (v2f i) : SV_Target{float3 col1 = Flow(_Noise1Tex, i.uv, _dir1, _flowStrength, _flowSpeed); // 計算第一個流動效果float3 col2 = Flow(_Noise1Tex, i.uv, _dir2, _flowStrength, _flowSpeed); // 計算第二個流動效果float val1 = 1.0 - saturate(pow(col1.r * _colorMul, _colorPow)); // 根據流動顏色計算第一個顏色值float val2 = 1.0 - saturate(pow(col2.r * _colorMul, _colorPow)); // 根據流動顏色計算第二個顏色值float4 noiseCol = tex2D(_Noise1Tex, float2(frac(_Time.y * _alphaSpeed), 0)); // 采樣噪聲紋理計算透明度float alpha = val1 * val2 * noiseCol.r * noiseCol.r; // 計算最終透明度float3 rgb = _mainColor.rgb * val1 * val2 * _colorAdd; // 計算最終顏色return half4(rgb, alpha); // 返回顏色和透明度}ENDCG}}
}
效果:
簡化版: