UnityShader 遮挡半透明Shader
//渲染被遮挡部分的Pass
pass{
blend SrcAlpha OneMinusSrcAlpha
ZTest greater // 把被遮住的部分的深度值写入深度缓存,和平时情况正好相反
Zwrite ON //开启深度写入
frag{
fixed4 col=fixed4(1,0,0,0.5);
}
}
//渲染没有被遮挡部分的Pass
pass{
//blend SrcAlpha OneMinusSrcAlpha //不需要混合
ZTest LEqual //小于等于
Zwrite OFF //关闭深度写入
frag{
fixed4 col=fixed4(1,1,0,1);
}
}
//也可以这样实现,效果是一样的
pass{
//blend SrcAlpha OneMinusSrcAlpha //不需要混合
ZTest Less
Zwrite ON
frag{
fixed4 col=fixed4(1,1,0,1);
}
}
问题:如果遮挡我们的物体本身是透明物体, 由于透明物体,没有深度写入,因此遮挡部分没有渲染为半透明, 问题是, 在和没有深度写入的半透明物体如何进行深度比较?
Camera.SetReplacementShader
//zclShader/Replacement.Shader 置换透明shader
SubShader{
Tags{ "RenderType"="Transparent"
}
struct v2f{
float4 vertex:POSITION;
float2 depth:TEXCOORD0;
}
v2f vert(appdata_base v){
v2f o;
o.vertex= UnityObjectToClipPos(v.vertex);
o.depth=o.vertex.zw;
return o;
}
fixed4 frag(v2f i):SV_Target{
float depth=i.depth.x/i.depth.y;
depth=Linear01Depth(depth);
fixed4 col=(depth,0,0,0);
return col;
}
public class ReplaceMentShader:MonoBehaviour{
void Start(){
Camera.main.SetReplacementShader(Shader.Find("zclShader/Replacement"),"renderType")
}