Es posible crear Render Textures donde cada píxel contiene un valor Depth de alta precisión. Esto se usa principalmente cuando algunos efectos necesitan que la Profundidad de la escena esté disponible (por ejemplo, las partículas suaves, la oclusión ambiental del espacio de la pantalla y la translucidez necesitarían la Profundidad de la Escena). Los Image Effects (Efectos de imagen) también usan Texturas de Profundidad .
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
}
}
}