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.
Los valores de píxeles en la textura de profundidad varían entre 0 y 1, con una distribución no lineal. La precisión es generalmente de 32 o 16 bits, dependiendo de la configuración y la plataforma utilizada. Cuando se lee desde la textura de profundidad, se devuelve un valor de alta precisión en un rango entre 0 y 1. Si necesita obtener la distancia desde la cámara, o un valor lineal de 0–1, calcule esto manualmente con macros de ayuda (ver a continuación).
Depth Textures are supported on most modern hardware and graphics APIs. Special requirements are listed below:
La mayoría de las veces, las Texturas de Profundidad se utilizan para procesar la profundidad de la cámara. El archivo include UnityCG.cginc contiene algunas macros para tratar la complejidad anterior en este caso:
Nota: En DX11/12, PS4, XboxOne y Metal, el rango del Búfer Z es de 1–0 y UNITY_REVERSED_Z está definido. En otras plataformas, el rango es 0–1.
For example, this shader would render depth of its GameObjects:
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
}
}
}