Culling & Depth Testing
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。
另一个使得渲染看起来正确的是深度测试。深度测试确保只有场景内的对象的最靠近的表面参与绘制。
Syntax 语法
Cull
Back : 控制几何体的那一面会被剔除(不绘制) 。
Front :不绘制背离观察者的几何体面。
Off : 显示所有面。用于特殊效果。ZWrite On | Off :控制是否将来之对象的像素写入深度缓冲(默认开启),如果你正绘制纯色物体,将此项打开。如果你正绘制半透明效果,关闭深度缓冲,更多细节如下
Offset Factor , Units:允许你定义用两个参数深度偏移。因子和单位。Factor 缩放Z的最大斜率,几何体的X和Y也一样,units缩放可计算的深度缓冲值。这允许你迫使一个几何体绘制在另一个的上层,尽管他们实际上是在同一个位置。例如偏移0,-1使得靠近摄像机的几何体忽略几何体的斜率,而偏移-1,-1则会几何体在一个几乎擦过的角度被观察使看起来更近些。
Examples 示例
//这个对象只会渲染对象的背面。
Shader "Show Insides" {
SubShader {
Pass {
Material {
Diffuse (1,1,1,1)
}
Lighting On
Cull Front
}
}
}
尽量应用到一个立方体上,并注意当你围绕几何体旋转时,几何体是如何看起来变糟糕的。 这是因为你只看见了立方体的内部部分。
Debugging Normals 调试法线
首先我们使用法线顶点光照渲染对象,然后我们使用亮粉处渲染背面。任何你的法线需要跳起的地方都会有高光的效果,如果你期望物理控制的对象有任意网格的吸入的效果时,可以尝试使用这个着色器。如果任何粉红色的部分显示,这些部分可能会不幸的带入任何事物。
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
}
}
}
Glass Culling 玻璃剔除
控制剔除比背面调试更有用。如果你有透明物体,你经常会想要显示一个对象的背面。如果你不做任何剔除,你会发现有时常有一部分背面会覆盖在前面的一部分上。
下面是一个用于凸物体(球,立方体,车窗)的简单着色器。
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
}
}
}
}
本文介绍了图形渲染中的两种关键优化技术:剔除与深度测试。剔除通过避免渲染背对观察者的几何体面来提高渲染效率,而深度测试则确保只有最近的表面参与绘制。文章还提供了如何在着色器中实现这两种技术的具体示例。
421

被折叠的 条评论
为什么被折叠?



