UnityShader之三 剔除、深度测试、Alpha测试

时间:2024-03-28 07:27:45

UnityShader系列文章转载于 @浅墨_毛星云,为本人的学习笔记,转载请注明出处。

文章链接:https://blog.csdn.net/poem_qianmo/article/details/41923661

 

剔除(Culling)

剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的。

 

深度测试(Depth Testing)

在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常存在遮挡关系,离观察点较远的物体会因为近处物体的遮挡而不可见或部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。深度测试可以简化复杂场景的绘制,确保只有场景内的对象的最靠近的表面参与绘制。

 

剔除与深度测试的相关句法

  • Cull Back | Front | Off

    • 用于控制几何体的哪一面会被剔除

    • Cull Back——不绘制背离观察者的几何面

    • Cull Front——不绘制面向观察者的几何面,用于由内向外的旋转对象

    • Cull Off——绘制所有的面

  • ZWrite On | Off

    •     用于控制是否将对象的像素写入深度缓冲(默认开启),如果需要绘制纯色物体,便将此项打开。如需绘制半透明效果,则关闭深度缓冲。

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

    • 用于控制深度测试如何执行

    • 缺省值是LEqual。如果要绘制的像素的Z值 小余等于深度缓冲区中的值,那么就用新的像素颜色值替换。

  • Offset Factor,Units

    • 利用Factor和Units来定义深度偏移

    • Factor参数表示Z缩放的最大斜率的值

    • Units参数表示可分辨的最小深度缓冲区的值

    • 利用该句法,我们就可以强制使位于同一位置上的两个集合体中的一个几何体绘制在另一个的上层

 

Alpha测试(Alpha testing)

    在Unity中,Alpha测试(Alpha Testing)是阻止像素被写到屏幕的最后机会。

UnityShader之三 剔除、深度测试、Alpha测试

    在最终渲染出的颜色被计算出来之后,可选择通过颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中

 

    Alpha测试在渲染凹型物体的透明部分时非常有用。显卡上有着每个像素写到屏幕上的深度记录。如果一个新的像素比原来的像素的深度深,那么新的像素就不会被写到屏幕上

 

Alpha测试相关句法

  • AlphaTest Off

    • 用于渲染所有的像素

  • AlphaTest comparison AlphaValue

    • 用于设定透明度测试只渲染在某一确定范围内的透明度值的像素,其中comparison取值如下

    • Greater——只渲染大于AlphaValue的像素

    • GEqual——只渲染大于等于AlphaValue的像素

    • Less——只渲染小于AlphaValue的像素

    • LEqual——只渲染小于等于AlphaValue的像素

    • Equal——只渲染等于AlphaValue的像素

    • NotEqual——只渲染不等于AlphaValue的像素

    • Always——渲染所有像素,等于关闭透明度测试AlphaTest Off

    • Never——不绘制任何像素

          AlphaValue为一个范围从0到1之间的浮点数

 

基本雾效设置

     雾效(Fog)参数用于控制雾相关的渲染。在计算机图形学中,雾化是通过混合已生成的像素的颜色和基于镜头的距离来确定的最终颜色来完成的。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。

 

    Unity设置中可以进行雾效的缺省值设置,如果使用了片段着色器,着色器中的雾设定仍然是有效的。如果平台没有对固定管线的雾功能支持,Unity会实时补上着色器以支持需要的雾模式。

 

雾效相关句法

  • Fog{FogCommands}

    • 用于设定雾命令的内容,具体的填在大括号之中的内容如下:

    • Mode Off | Global | Linear | Exp | Exp2

      • 用于 定义雾模式。缺省值为全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值

    • Color ColorValue

      • 用于设定雾的颜色值

    • Density FloatValue

      • 以指数的方式设定雾的密度

    • Range FloatValue,FloatValue

      • 用于为linear类型的雾设定远近距离值

 

综合应用

  • 用剔除实现简单玻璃效果

        

          UnityShader之三 剔除、深度测试、Alpha测试UnityShader之三 剔除、深度测试、Alpha测试

 

Shader "typedef/Volume3/3.用剔除实现玻璃效果" {

        Properties {

               _Color ("主颜色", Color) = (1,1,1,0)

               _SpecColor("高光颜色",Color) = (1,1,1,1)

               _Emission("光泽颜色",Color) = (0,0,0,0)

               _Shininess("光泽度",Range(0.01,1)) = 0.7

               _MainTex ("主纹理 (RGB)", 2D) = "white" {}

               

        }

        SubShader {

               //材质

               Material{

                       //漫反射

                       Diffuse[_Color]

                       //环境光颜色

                       Ambient[_Color]

                       //高光颜色

                       Specular[_SpecColor]

                       //光泽颜色

                       Emission[_Emission]

                       //光泽度

                       Shininess[_Shininess]

               }

               //开启光照

               

               Lighting On

               //开启独立镜面反射

               

               SeparateSpecular On

               //开启透明度混合

               Blend SrcAlpha OneMinusSrcAlpha

               //通道一

               //说明:渲染对象的背面部分

               Pass{

                       //如果对象是凸型,那么总是离镜头离得比前面的更远

                       Cull Front     //不绘制观察者的几何面

                       SetTexture[_MainTex]{

                              Combine Primary * Texture

                       }

               }

               //通道二

               //说明:渲染对象背对我们的部分

               Pass{

                       //如果对象是凸型,那么总是离镜头离得比背面更远

                       Cull Back      //不绘制背离观察者的几何面

                       SetTexture[_MainTex]{

                              Combine Primary * Texture

                       }

               }

        }

        

}

  • 简单植被Shader

        UnityShader之三 剔除、深度测试、Alpha测试

        UnityShader之三 剔除、深度测试、Alpha测试UnityShader之三 剔除、深度测试、Alpha测试

 

Shader "typedef/Volume3/6.简单植被的Shader" {

        Properties {

               _Color ("主颜色", Color) = (0.5,0.5,0.5,0.5)

               _MainTex ("基础纹理(RGB) - 透明度(A)" , 2D) = "white" {}

               _Cutoff("透明度阈值",Range(0.01,1)) = 0.5

        }

        SubShader {

               //材质,顶点颜色

               Material{

                       Diffuse[_Color]

                       Ambient[_Color]

               }

               //开启光照

               Lighting On

               //关闭裁剪

               Cull Off

               //通道一

               //说明:渲染所有超过[_Cutoff]不透明的像素

               Pass{

                       //只渲染透明度大于_Cutoff的像素

                       AlphaTest Greater [_Cutoff]

                       SetTexture[_MainTex]{

                              combine texture * primary,texture

                       }

               }

               Pass{

                       //不写到深度缓冲中

                       ZWrite off

                       //不写已经写过的像素

                       ZTest Less

                       //深度测试中,只渲染小于或等于的像素值

                       AlphaTest LEqual [_Cutoff]

                       

                       //设置透明度混合

                       Blend SrcAlpha OneMinusSrcAlpha

                       //进行纹理混合

                       SetTexture[_MainTex]{

                              combine texture * primary,texture

                       }

               }

        }

        

}