ShaderLab: Culling & Depth Testing

原文链接:https://docs.unity3d.com/Manual/SL-CullAndDepth.html

(图片见原网页)

        剔除是一个优化手段来使背朝屏幕的多边形不会被渲染。所有的多边形都有一个正面和背面,剔除使用了大多数物体被忽略的事实;如果你有一个正方体,你将永远不会看到它背朝你的一面(它总是在你前面有一面朝向你),所以我们不需要绘制背面,所以就出现了“背面剔除”这一术语。

        另一个使渲染看起来正确的功能就是深度测试。深度测试确保了在场景中只绘制最靠近的对象。


语法

Cull

Cull Back | Front | Off

        控制多边形的哪一面应该被剔除(不绘制)

        ·Back 不渲染多边形背朝屏幕的一面(默认)。

        ·Front 不渲染多边形面朝屏幕的一面。用于使对象变成由内向外的。

        ·Off 不使用剔除-所有面都被绘制。用于特殊的效果。


ZWrite

ZWrite On | Off

        控制此对象上的像素是否写入深度buffer(默认为On)。如果您要绘制实体对象,请将其保留为On。如果您正在绘制半透明效果,请切换到ZWrite Off。有关详细信息,请参见下文。


ZTEST

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

        应该如何进行深度测试。默认值是LEqual(绘制在这个距离或者是在其前面的对象,它们后面的对象)。


Offset

Offset Factor, Units

        允许你使用两个参数来指定一个深度偏移,factor和units。Factor缩放相对于多边形X,Y轴的Z轴斜率的最大值,units缩放深度buffer可分辨的最小值。这可以使您强制将一个多边形绘制在另一个多边形上,尽管它们实际上位于相同位置。例如Offset 0, -1将忽略多边形的斜率使多边形更靠近摄像机,反之Offset -1, -1当以切线角观察时会更加靠近。


例子

        这个对象将只渲染其背面。

Shader "Show Insides" {

    SubShader {

        Pass {

            Material {

                Diffuse (1,1,1,1)

            }

            Lighting On

            Cull Front

        }

    }

}

        尝试将它放到一个正方体上,并且当你环绕观察它的时候注意感觉它的几何体都是不对的。这是因为你只看到了正方体的内部。


有深度写入的透明shader

       通常半透明shader(链接见原网页)不写入深度buffer。然而,这会导致绘制顺序问题,特别是对于复杂的非凸面网格。如果你想要像那样淡入&淡出网格,那么在渲染透明物体之前使用一个shader填充深度buffer也许会有用。

(图片见原网页)

半透明物体:左:单独的Transparent/Diffuse shader;右:增加了深度buffer写入的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

    // extra pass that renders to depth buffer only

    Pass {

        ZWrite On

        ColorMask 0

    }

    // paste in forward rendering passes from Transparent/Diffuse

    UsePass "Transparent/Diffuse/FORWARD"

}

Fallback "Transparent/VertexLit"

}


调试法线

        下一个更加有趣:首先我们用正常的顶点光照渲染对象,然后我们用亮粉色渲染背面。这有一个重点显示您的法线需要被翻转的效果。如果你看到任何物理控制的对象被一些网格吸入,尝试将这个shader设置给他们。如果看到任何粉色的部分,这些部件会吸入任何不幸触及它的东西。

        下面我们开始:

Shader "Reveal Backfaces" {

    Properties {

        _MainTex ("Base (RGB)", 2D) = "white" { }

    }

    SubShader {

        // Render the front-facing parts of the object.

        // We use a simple white material, and apply the main texture.

        Pass {

            Material {

                Diffuse (1,1,1,1)

            }

            Lighting On

            SetTexture [_MainTex] {

                Combine Primary * Texture

            }

        }

        // Now we render the back-facing triangles in the most

        // irritating color in the world: BRIGHT PINK!

        Pass {

            Color (1,0,1,1)

            Cull Front

        }

    }

}


玻璃剔除

        控制剔除比调试背面更有用。如果你有一个透明物体,你会非常需要显示这个物体的背面。如果你将不使用剔除来渲染(Cull Off),那很有可能会出现背面和正面互相覆盖的情况。

        这是一个简单的着色器,适用于凸面物体(球体,立方体,汽车挡风玻璃)。

Shader "Simple Glass" {

    Properties {

        _Color ("Main Color", Color) = (1,1,1,0)

        _SpecColor ("Spec Color", Color) = (1,1,1,1)

        _Emission ("Emmisive Color", Color) = (0,0,0,0)

        _Shininess ("Shininess", Range (0.01, 1)) = 0.7

        _MainTex ("Base (RGB)", 2D) = "white" { }

    }

    SubShader {

        // We use the material in many passes by defining them in the subshader.

        // Anything defined here becomes default values for all contained passes.

        Material {

            Diffuse [_Color]

            Ambient [_Color]

            Shininess [_Shininess]

            Specular [_SpecColor]

            Emission [_Emission]

        }

        Lighting On

        SeparateSpecular On

        // Set up alpha blending

        Blend SrcAlpha OneMinusSrcAlpha

        // Render the back facing parts of the object.

        // If the object is convex, these will always be further away

        // than the front-faces.

        Pass {

            Cull Front

            SetTexture [_MainTex] {

                Combine Primary * Texture

            }

        }

        // Render the parts of the object facing us.

        // If the object is convex, these will be closer than the

        // back-faces.

        Pass {

            Cull Back

            SetTexture [_MainTex] {

                Combine Primary * Texture

            }

        }

    }

}

你可能感兴趣的:(ShaderLab: Culling & Depth Testing)