Использование текстур глубины
It is possible to create Render Textures where each pixel contains a high-precision Depth value. This is mostly used when some effects need the Scene’s Depth to be available (for example, soft particles, screen space ambient occlusion and translucency would all need the Scene’s Depth). Image Effects often use Depth Textures too.
Значения пикселей в текстуре глубины находятся в диапазоне от 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 = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_DEPTH(o.depth);
return o;
}
half4 frag(v2f i) : SV_Target {
UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
}
}
}