Version: 6000.3
语言: 中文
在URP的着色器中可视化法线向量
在 URP 的着色器中重建世界空间位置

在通用渲染管线着色器中编写仅深度通道

要创建深度预通道,在不透明和透明通道之前写入对象的深度,请添加一个着色器在 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);
    }}

其他资源

在URP的着色器中可视化法线向量
在 URP 的着色器中重建世界空间位置