●透明是游戏中经常使用的一种效果,在实时渲染透明效果,通常会在渲染模型时控制它的透明通道。在unity中实现透明效果有两种方式:透明度测试(只有全透明与不透明两种),透明度混合(透明度可控,关闭深度缓冲写入)。
●渲染顺序是在写透明效果shader中非常重要的参数,在渲染所有不透明的物体时,可以不用考虑渲染顺序,因为有深度缓冲的存在。它的原理是把模型离摄像机的距离记录下来,再渲染片元的时候,就把缓冲的深度值与当前距离摄像机的距离作比较,谁近一些就渲染谁。所以可以不用考虑渲染顺序,但是在写透明物体是需要关闭深度缓冲,因为如果透明物体在不透明物体前面,这个时候我们是需要渲染出来不透明物体的。如果打开了深度缓冲写入的话,不透明物体就不会渲染出来了。 这里给一个结论:就是我们需要先渲染不透明的物体然后再渲染透明的物体。
●这里有两个文章,都写的很详细。可以看看。文章1,文章2
●透明度测试代码中调用了裁剪的方法:
//这里是根据阀值来裁剪值
clip(texColor.a-_Cutoff);
这个方法等价于:
if((texColor.a-_Cutoff)<0.0){
discard;
}
●AlphaTest标签设置:
Tags{"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
●透明度混合代码中关闭了深度缓冲写入与开启混合值:
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
●AlphaBlend标签设置:
Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}