Custom Shader GUI (GUI Shader Personalizado)
La Depth Texture (Textura de Profundidad) de la cámara

Utilizando Depth Textures (Texturas de profundidad)

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:

  • Direct3D 11+ (Windows), OpenGL 3+ (Mac/Linux), OpenGL ES 3.0+ (Android/iOS), Metal (iOS) y consolas como PS4/Xbox One todas soportan texturas de profundidad.
  • Direct3D 9 (Windows) requiere una tarjeta gráfica para soportar el formato de textura “INTZ” para obtener texturas de profundidad.
  • OpenGL ES 2.0 (iOS/Android) requiere que la extensión GL_OES_depth_texture esté presente.
  • WebGL requiere la extensión WEBGL_depth_texture.

Macros de Ayuda Depth Texture Shader

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:

  • UNITY_TRANSFER_DEPTH(o): Calcula la profundidad del espacio ocular del vértice y lo emite en o (que debe ser un float2). Utilícelo en un vertex program al renderizar una textura de profundidad. En plataformas con texturas de profundidad nativas, esta macro no hace nada, porque el valor del búfer Z se representa implícitamente.
  • UNITY_OUTPUT_DEPTH(i): Devuelve la profundidad del espacio ocular desde i (que debe ser un float2). Utilícelo en un fragment program al convertirlo en una textura de profundidad. En plataformas con texturas de profundidad nativas esta macro siempre devuelve cero, porque el valor del búfer Z se representa implícitamente.
  • COMPUTE_EYEDEPTH(i): computes eye space depth of the vertex and outputs it in o. Use it in a vertex program when not rendering into a depth texture.
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i): given high precision value from depth texture i, returns corresponding eye space depth.
  • Linear01Depth(i): given high precision value from depth texture i, returns corresponding linear depth in range between 0 and 1.

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
        }
    }
}

Mirar también

Custom Shader GUI (GUI Shader Personalizado)
La Depth Texture (Textura de Profundidad) de la cámara