Unity 6.3
0 онлайн 54 гостей 3 в системе
Вход

Запись пропуска только глубины в Universal Render Pipeline шейдере

Чтобы создать предварительный проход глубины, который записывает глубину объектов перед проходами непрозрачности и прозрачности, добавьте проход шейдера, имеющий тег DepthOnly.

Добавьте этот проход, если вы включили параметр, требующий предварительного прохода глубины, в противном случае Unity может отображаться неправильно. Например, если вы включили Depth Priming в Ассет Universal Render Pipeline (URP), непрозрачные объекты будут невидимы.

Важно: Для правильного отображения, убедитесь, что каждый проход шейдера отображает одинаковое количество фрагментов в одинаковых позициях. Например, используйте включения или макросы для совместного использования одного и того же кода между проходами, особенно если вы изменяете позиции вершин, используете альфа-обрезку или используете эффекты, такие как дитерринг.

Добавить пропуск только глубины

В следующем примере показано, как добавить пропуск только глубины к шейдеру:

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

Дополнительные ресурсы