最简单的切除
在SubShader中的Pass中使用指令Cull Off
,Cull Back
,Cull Front
可以关闭切除
,切除背面
,切除正面
。
默认情况下Pass使用的是Cull Back
。
需要注意的是这些指令需要放在CGPROGRAM
前声明。
大部分GPU还支持语义VFACE
,这更容易区分正面或者背面,但并不是所有的GPU都支持,详见:Shader semantics
discard指令
当Pass中声明了指令Cull Off后,依旧可以进行切除,在fragment阶段,使用discard;
可以跳过渲染。比如下面代码会把物体的上半部分切除。
float4 frag(vertexOutput input) : COLOR
{
if (input.posInObjectCoords.y > 0.0)
{
discard; // drop the fragment if y coordinate > 0
}
return float4(0.0, 1.0, 0.0, 1.0); // green
}
需要注意的是discard指令是一个比较消耗性能的指令,需要权衡使用。
多Pass实现物体的内部渲染
由于默认情况下物体的切除指令是Cull Back,因此当相机镜头进入一个Box的内部后,看到的会是天空盒。那么如何对这个Box外面和内部都渲染呢?
最简单的自然是使用指令Cull Off。
那么如何让内部和外部有不同的渲染规则(比如Color不一样)呢?
答案是使用多Pass。针对我们这个问题只需要使用两个Pass即可。一个Pass用来设置正面渲染,第二个Pass用来设置方面渲染。
需要说明的是,当GPU选定某个SubShader作为最适合的后,那么该SubShader内部所有的Pass都会被执行。