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).

Las texturas de profundidad se soportan en la mayoría de hardware moderno y APIs gráficas. Los requerimientos especiales se listan abajo:

  • 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): Calcula la profundidad del espacio ocular del vértice y lo emite en o. Utilícelo en un vertex program cuando no se muestre en una textura de profundidad.
  • DECODE_EYEDEPTH(i): given high precision value from depth texture i, returns corresponding eye space depth. This macro just returns i*FarPlane on Direct3D. On platforms with native depth textures it linearizes and expands the value to match camera’s range. Note: On DX11/12, PS4, XboxOne and Metal, the Z buffer range is 1–0 and UNITY_REVERSED_Z is defined. On other platforms, the range is 0–1.

Por ejemplo, este shader renderizaría la profundidad de sus objetos:

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