原文链接: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
}
}
}
}