首先先上一张效果图
可以看到黑色面片的中间受点光源而变成透明的。
而要完成这一效果需要编写两个shader以及两个面片。而原理也不难,底部面片受点光源的影响而改变透明度,而这一步骤的需要主要注意的就是设置Blend(混合方式),而上面的面片则通过底部面片的透明度而选择遮住哪些部分。
描述显得有些无力,直接上代码。
首先是底部面片的shader代码:
Shader "Unlit/Masker_base" { Properties { _Alpha ("Alpha",Range(0,1)) = 1 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } Pass { Tags { "LightMode" = "ForwardBase" } ZWrite off Blend zero one,one zero CGPROGRAM #pragma multi_compile_fwdbase #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "AutoLight.cginc" sampler2D _MainTex; float4 _MainTex_ST; float _Alpha; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o; } fixed4 frag (v2f i) : SV_Target { return fixed4(0,0,0,_Alpha); } ENDCG } Pass { Tags { "LightMode" = "ForwardAdd" } ZWrite off blendop add,min //对透明度通道使用最小值运算 Blend zero one,one one CGPROGRAM #pragma multi_compile_fwdadd #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "autoLight.cginc" #include "Lighting.cginc" struct appdata{ float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 worldPos : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o;o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldPos = mul(unity_ObjectToWorld,v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { UNITY_LIGHT_ATTENUATION(attenuation, i, i.worldPos.xyz); return fixed4(0,0,0,1 - attenuation); } ENDCG } } }
上面面片shader代码:
Shader "Unlit/Masker_above" { Properties { _Color ("Color",COLOR) = (1,1,1,1) } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } Pass { Tags { "LightMode" = "ForwardBase" } ZWrite off Blend DstAlpha OneMinusDstAlpha //最后混合出的颜色受上一层的透明度的影响 CGPROGRAM #pragma multi_compile_fwdbase #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "AutoLight.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Color; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { return _Color; } ENDCG } } }
使用这种遮罩可以完成很多效果,如黑夜中发光的效果。
暂无关于此日志的评论。