• Unity3d Shader开发(三)Pass(Culling & Depth Testing)


    Culling 剔除

    剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。

    另一个使得渲染看起来正确的是深度测试。深度测试确保只有场景内的对象的最靠近的表面参与绘制。

    Syntax 语法

    Cull Back | Front | Off
    控制几何体的那一面会被剔除(不绘制) 
    Back 
    不绘制背离观察者的几何体面。 
    Front 
    不绘制面向观察者的几何体面,用于由内自外的旋转对象 
    Off 
    显示所有面。用于特殊效果。
    ZWrite On | Off
    控制是否将来之对象的像素写入深度缓冲(默认开启),如果你正绘制纯色物体,将此项打开。如果你正绘制半透明效果,关闭深度缓冲,更多细节如下
    ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
    深度测试如何执行。缺省是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏他们背后的对象)
    Offset Factor , Units
    允许你定义用两个参数深度偏移。因子和单位。Factor 缩放Z的最大斜率,几何体的X和Y也一样,units缩放可计算的深度缓冲值。这允许你迫使一个几何体绘制在另一个的上层,尽管他们实际上是在同一个位置。例如偏移0,-1使得靠近摄像机的几何体忽略几何体的斜率,而偏移-1,-1则会几何体在一个几乎擦过的角度被观察使看起来更近些。

    示例

    这个对象只会渲染对象的背面。

    Shader "Show Insides" {
        SubShader {
            Pass {
                Material {
                    Diffuse (0,1,1,1)
                }
                Lighting On
                Cull Front
            }
        }
    } 

    我把太阳光正对着摄像机,Cube正对摄像机

    尽量应用到一个立方体上,并注意当你围绕几何体旋转时,几何体是如何看起来变糟糕的。 这是因为你只看见了立方体的内部部分。

    玻璃剔除

    控制剔除比背面调试更有用。如果你有透明物体,你经常会想要显示一个对象的背面。如果你不做任何剔除,你会发现有时常有一部分背面会覆盖在前面的一部分上。

    下面是一个用于凸物体(球,立方体,车窗)的简单着色器。

    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
                }
            }
        }
    }

  • 相关阅读:
    Docker常用命令操作记录
    第一个netty程序--时间服务
    zookeeper+dubbo配置
    通过IRBuilder新建LLVM IR
    TVM结构介绍
    /lib64/libc.so.6 错误导致的系统崩溃
    php 间歇性报 Segmentation fault
    Dell服务器安装OMSA管理工具
    【Selenium学习笔记】网页截图实践
    局域网内网机器上网实操
  • 原文地址:https://www.cnblogs.com/martianzone/p/3342489.html
Copyright © 2020-2023  润新知