Использование текстур глубины
Существует возможность создавать рендер-текстуры, где каждый пиксель содержит точное значение “глубины” (см. RenderTextureFormat.Depth). Это в основном используется, когда для каких-нибудь эффектов нужно, чтобы глубина сцены была доступна (например, для мягких частиц, SSAO, полупрозрачности потребуется глубина сцены).
Значения пикселей в текстуре глубины находятся в диапазоне от 0 до 1 с нелинейным распространением. Точность обычно 24 или 16 бит, в зависимости от используемого буфера глубины. При обращении к текстуре глубины возвращается высокоточное значение в диапазоне от 0 до 1. Если вам нужно получить расстояние от камеры или линейное значение, то вам следует вычислять это вручную.
Depth textures are supported on most modern hardware and graphics APIs. Special requirements are listed below:
Использование макроса-помощника текстуры глубины
Большая часть времени текстуры глубины используются, чтобы рендерить глубину относительно камеры. Подключаемый файл UnityCG.cginc
содержит некоторые макросы, чтобы решать ситуацию без дополнительных сложностей:
Например, этот шейдер будет рендерить глубину своих объектов:
Shader "Render Depth" {
SubShader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
float2 depth : TEXCOORD0;
};
v2f vert (appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}