包含此页的版本:
不含此页的版本:
要创建深度预通道,在不透明和透明通道之前写入对象的深度,请添加一个着色器在 GPU 上运行的程序。更多信息
请参阅术语表具有DepthOnly标记。
如果启用需要深度预处理的设置,请添加此通道,否则 Unity 可能会不正确渲染。例如,如果你在通用渲染Pipleine(URP)资产中启用深度启动,则不透明对象是不可见的。
重要提示:要正确渲染,请确保每个着色器通道在相同位置渲染相同数量的片段。例如,使用包含或宏在通道之间共享相同的代码,尤其是在更改顶点位置、使用 alpha 剪切或使用抖动等效果时。
以下示例演示如何向着色器添加仅深度通道:
Shader "Example/CustomShader"
{
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
// Add a depth-only pass
Pass
{
Name "DepthOnlyPass"
Tags { "LightMode" = "DepthOnly" }
// Write depth to the depth buffer
ZWrite On
// Don't write to the color buffer
ColorMask 0
...
}
// The forward pass. This pass also writes depth by default.
Pass
{
Name "ForwardPass"
Tags { "LightMode" = "UniversalForward" }
...
}
}
}
建议的最佳实践是同时添加具有DepthNormals标记,以写入对象的深度和法线。否则,如果您启用屏幕空间等功能环境光遮挡一种近似环境光(不是来自特定方向的光)可以击中表面上的点的量的方法。
请参阅术语表(SSAO) 时,Unity 可能无法正确渲染对象。
有关输出法线的更多信息,请参阅在URP 中的着色器中可视化法线向量。
例如:
Pass
{
Name "DepthNormalsPass"
Tags { "LightMode" = "DepthNormals" }
// Write depth to the depth buffer
ZWrite On
...
float4 frag(Varyings input) : SV_TARGET
{
// Return the normal as a value between 0 and 1
float3 normalWS = normalize(input.normalWS);
return float4(normalWS * 0.5 + 0.5, 1);
}}