Version: 2020.1
Custom Shader GUI
Текстура глубины камеры

Использование текстур глубины

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:

  • Direct3D 11+ (Windows), OpenGL 3+ (Mac/Linux), OpenGL ES 3.0+ (iOS), Metal (iOS) and consoles like PS4/Xbox One all support depth textures.
  • OpenGL ES 2.0 (Android) requires GL_OES_depth_texture extension to be present.
  • Видеокарта должна поддерживать расширение GL_OES_depth_texture.

Использование макроса-помощника текстуры глубины

Большая часть времени текстуры глубины используются, чтобы рендерить глубину относительно камеры. Подключаемый файл UnityCG.cginc содержит некоторые макросы, чтобы решать ситуацию без дополнительных сложностей:

  • UNITY_TRANSFER_DEPTH(o): вычисляет глубину вершин в пространстве зрителя и присваивает это значение переменной o (которая должна быть типа float2). Используйте это в вершинной программе, когда рендерите в текстуру глубины. На платформах с нативными текстурами глубины этот макрос не делает абсолютно ничего, потому что значение Z-буфера безоговорочно рендерится.
  • UNITY_OUTPUT_DEPTH(i): возвращает глубину пространства зрителя из переменной i (которая должна быть типа float2). Используйте это в фрагментной программе, когда рендерите в текстуру глубины. На платформах с нативными текстурами глубины этот макрос возвращает ноль, потому что значение Z-буфера безоговорочно рендерится.
  • 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.

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.

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

Смотрите так же

Custom Shader GUI
Текстура глубины камеры