[Unity3D][Shader]PANCgShader--第二章 透明面--01部分切除

最简单的切除

在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都会被执行。

发布了198 篇原创文章 · 获赞 23 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/iningwei/article/details/100587911
今日推荐