Shaderlab:剔除&深度测试
剔除是一种优化,即不会渲染多变体上远离观察者的面。所有的多面体都有中正面和反面。剔除使用了大多数的对象是闭合的这一事实:如果有一个正方体,你永远都看不到距离你最远的面。根据这一事实,所以不必绘制这样的面。这就是背面剔除的由来。
还有一种使物体看起来正确渲染的方式是深度测试,深度测试保证了只有最近的表面会被绘制。
语法
Culling
Cull Back | Front | Off
控制多面体的哪一面将被剔除
- Back 不会渲染远离观察者的面(默认)
- Front 将不渲染朝向观察者的面。用于将物体从内到外翻转。
- Off 关闭剔除,意味着所有的面都会被绘制。用于特效。
ZWrite
ZWrite On|Off
控制来自于对象的像素点是否被写入深度测试(默认是打开)。如果绘制固态物体,打开。如果绘制半透明效果,请关闭。更多细节阅读下文。
ZTest
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
ZTest说明深度测试是如何执行的。默认是LEqual(以现有对象的距离来绘制对象,隐藏他们后面的对象)
Offset
Offset Factor, Units
允许使用两个参数(Factor和Units)来指定深度偏移。Factor相对于X或Y缩放Z的最大斜率,Units用于缩放最小可缩放深度缓存值。这样可以强制优先绘制某一个多面体,即便是有一个多面体和它在同一位置。举个例子:Offset 0,-1
可以忽略多面体的斜率(slope)将多面体拉近到摄像机,而Offset -1,-1
将会将多边形拉的更近,即便当他们看起来是掠角。
例子
下面的例子将只渲染物体的背面
Shader "Show Insides" { SubShader { Pass { Material { Diffuse (1,1,1,1) } Lighting On Cull Front } } }
尝试应用在Cube上面,请注意当围着Cube转的时候会发现渲染方式是错误的。因为这只能看到Cube内部。
Transparent shader with depth writes
通常来说半透明的shader不会写入到深度缓存中的。但是这样做却有可能导致绘制顺序问题,尤其是在一些复杂的非凸网格上面。如果你想要类似淡入/淡出网格,在渲染透明之前将其填充到深度缓存中会很有用。
Shader "Transparent/Diffuse ZWrite" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 200 Pass { ZWrite On ColorMask 0 } UsePass "Transparent/Diffuse/FORWARD" } Fallback "Transparent/VertexLit" }