本文主要是自己对面剔除的一些理解和感悟,如有理解不当的地方,欢迎交流指正
一、基本概念介绍
面剔除就是指检查一个面相对于摄像机也就是观察者的朝向是顺时针还是逆时针,以三角形举例,如果一个三角形我们从正面看它是顺时针,那么背面就是逆时针,以此来区分正面和被面。
在unity里默认的就是背面剔除,比如一个平面,添加了标准材质后它只有正面可以看到,背面则观察不到;(以立方体为例,立方体的每个面都是有正面和背面的,而背面是观察不到的);对于这两个例子,听起来会比较难懂,接下来会做详细解释。
二、untiy中的面剔除与深度检测
Cull在渲染管线中的位置是光栅化阶段,也就是顶点着色器之后,片元着色器之前,它的存在是为了提高渲染的性能,避免做一些无用片元的渲染计算。
对于一个立方体而言,我们在untiy中看一个立方体最多只能看到三个面,其它的面为什么看不到呢?我之前一直理解为深度测试剔除了后面的片元,其实并不是(这一点我比较蠢),是开启了背面裁剪导致其它三个面被裁减掉,因为其它面在背对着相机时它对于摄像机来说就是一个背面,就会被剔除掉,根本走不到深度测试这一步。面剔除可以帮助我们减少片元的渲染计算,如果没有面剔除,这些背面可能会在计算完之后才能经过深度测试被抛弃掉,做了很多无用功。
深度测试,它可以帮助我们确定场景中物体的遮挡关系,它一般都在片元着色器之后的逐片元操作中,但是unity将深度测试放置到片元着色之前,面剔除之后,这种方式可以提前剔除不需要进行片元计算的片元,这种技术为Early-Z技术(现在大部分的GPU都提供一个叫做提前深度测试(Early Depth Testing)的硬件特性。提前深度测试允许深度测试在片段着色器之前运行。只要我们清楚一个片段永远不会是可见的(它在其他物体之后),我们就能提前丢弃这个片段。片段着色器通常开销都是很大的,所以我们应该尽可能避免运行它们)。
其实对于一个物体而言,背面剔除就会剔除掉几乎所有不需要渲染的面片,而不需要用到深度测试;深度测试多用于物体之间,保证各个物体间正确的排列顺序,而背面剔除用于剔除自身背面。考虑到渲染状态时,不能局限于一个物体的片元,更应该考虑到物体之间的相互关系,不然就会出现考虑不周的地方。
三、着色器内的Cull命令
unity着色器内的Cull命令一共有三个,Cull Back(默认),Cull Front,Cull Off
Cull Front是剔除正面,该命令可以让我们看到背面,在透明效果中,比如一个立方体,如果我们希望看到立方体的正面和背面,就需要使用到这个命令,不是Cull Off命令,因为透明效果需要关闭深度检测,使用Cull Off会导致渲染顺序出错,这个后面还会讲到。
Cull Off是关闭剔除,这个命令可以让我们看到正面和背面,但也会带来比较大的花销;
对于一个平面而言,Cull Off可以让我们看到背面;但是对于一个立方体而言,Cull Off还是没能让我们看到背面,这是因为片元还要经历深度测试,一般来说除了平面之外,其它三维物体即使关闭了剔除,它的背面也会由于深度检测被剔除掉,而且我们往往不需要看到背面。所以Cull Off命令通常用在我们需要在场景中同时看到正面和反面,比如将plane用作楼层地板、墙板等;
但是不要同时使用Cull Off命令和ZTest Off命令,上面讲到一个立方体使用了Cull Off命令后还会因为深度检测看不到背面,所以就想着如果关闭深度检测就可以了,深度检测一旦关闭,该立方体就不能被正确的渲染了;如下图,可以看到这个立方体的z轴正方向的面和y轴正方向的面都没了,因为z轴正方向的面的顶点坐标是最先被处理的,没有了深度测试,它的颜色值就会被之后其它面的颜色覆盖掉,也就不会显示出来了。

如果大家想对Cull命令和ZTest命令做一些效果上的尝试用以加深理解,下面提供一个着色器来供大家修改尝试(需要创建一个立方体,然后为六个面贴上不同的贴图,从而观察效果)。
Shader "MyShader/Cube CullTest" { Properties { _Color ("Color", Color) = (1,1,1,1) _TopTex("Top Tex(Y+)", 2D) = "white" {} _BottomTex("Bottom Tex(Y-)", 2D) = "white" {} _LeftTex ("Left Tex(X+)", 2D) = "white" {} _RightTex("Right Tex(X-)", 2D) = "white" {} _FrontTex("Front Tex(Z+)", 2D) = "white" {} _BehindTex("Behind Tex(Z-)", 2D) = "white" {} } SubShader { Pass{ Tags { "LightMode"="ForwardBase" } Cull Back ZTest Off CGPROGRAM #include "Lighting.cginc" #pragma vertex vert #pragma fragment frag #define PRESICION 0.5f-10e-5 fixed4 _Color; sampler2D _TopTex; sampler2D _BottomTex; sampler2D _LeftTex; sampler2D _RightTex; sampler2D _FrontTex; sampler2D _BehindTex; float4 _LeftTex_ST; float4 _RightTex_ST; float4 _TopTex_ST; float4 _BottomTex_ST; float4 _FrontTex_ST; float4 _BehindTex_ST; struct a2v{ float4 vertex : POSITION; float4 texcoord : TEXCOORD0; }; struct v2f{ float4 pos : SV_POSITION; float4 vertex : TEXCOORD0; //top bottom fixed4 uv1 : TEXCOORD1; //left right fixed4 uv2 : TEXCOORD2; //front behind fixed4 uv3 : TEXCOORD3; }; v2f vert(a2v v){ v2f o; o.vertex = v.vertex; //v.vertex.xyz=v.vertex.xyz+0.5*v.vertex.xyz; o.pos=UnityObjectToClipPos(v.vertex); o.uv1.xy = v.texcoord.xy * _TopTex_ST.xy + _TopTex_ST.zw; o.uv1.zw = v.texcoord.xy * _BottomTex_ST.xy + _BottomTex_ST.zw; o.uv2.xy = v.texcoord.xy*_LeftTex_ST.xy+_LeftTex_ST.zw; o.uv2.zw = v.texcoord.xy * _LeftTex_ST.xy + _LeftTex_ST.zw; o.uv3.xy = v.texcoord.xy * _FrontTex_ST.xy + _FrontTex_ST.zw; o.uv3.zw = v.texcoord.xy * _BehindTex_ST.xy + _BehindTex_ST.zw; return o; } fixed4 frag(v2f i) : SV_Target{ fixed4 finalCol = fixed4(1.0f,1.0f,1.0f,1.0f); if (i.vertex.x >= PRESICION) { //finalCol= fixed4(0.2f, 0.3f, 1.0f, 1.0f); finalCol = tex2D(_LeftTex,i.uv1.xy); } else if (-i.vertex.x >= PRESICION) { finalCol = tex2D(_RightTex, i.uv1.xy); } else if (i.vertex.y >= PRESICION) { //finalCol= fixed4(0.2f, 0.3f, 1.0f, 1.0f); finalCol = tex2D(_TopTex, i.uv1.xy); } else if (-i.vertex.y >= PRESICION) { finalCol = tex2D(_BottomTex, i.uv1.xy); } else if (i.vertex.z >= PRESICION) { //finalCol= fixed4(0.2f, 0.3f, 1.0f, 1.0f); finalCol = tex2D(_FrontTex, i.uv1.xy); } else if (-i.vertex.z >= PRESICION) { finalCol = tex2D(_BehindTex, i.uv1.xy); } //fixed4 finalCol = tex2D(_MainTex,i.uv); return fixed4(finalCol.rgb,1.0f); } ENDCG } } FallBack "Diffuse" }
讯享网
四、更多资料
1. OpenGL面剔除

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/119747.html