Запись пропуска только глубины в 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);
}}