测试用shader,就是在Unlit基础上开启Blend,开启深度写入(红色加粗部分)
Shader "My/Blend/Unlit_Blend_ZWriteOn" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" "Queue" = "Transparent" } LOD 100 Blend SrcAlpha OneMinusSrcAlpha ZWrite On 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; }; sampler2D _MainTex; float4 _MainTex_ST; 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 { fixed4 c = tex2D(_MainTex, i.uv); return c; } ENDCG } } }
然后我们在场景中摆2个物体,贝壳离相机近,气泡离相机远;但贝壳先绘制气泡后绘制(RenderQueue越小越先绘制);最终会看到,两者没混合,气泡直接被裁了一部分。
原因就是:贝壳先绘制,然后写了深度值;气泡后面绘制的时候,会进行深度测试,因为气泡离相机更远,他们重叠的部分无法通过深度测试,像素就被直接丢弃了。
下面关闭深度写入ZWrite Off,贝壳先绘制,气泡后绘制,气泡盖在了贝壳上,同时进行了混合
参考
shader入门精要8.1节
标签:MainTex,vertex,uv,写入,开启,绘制,Blend,气泡 From: https://www.cnblogs.com/sailJs/p/17179368.html