Version: 5.4
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.
  • Direct3D 9 (Windows) requires a graphics driver to support “INTZ” texture format to get depth textures.
  • Видеокарта должна поддерживать расширение GL_OES_depth_texture.
  • Видеокарта должна поддерживать расширение GL_OES_depth_texture.

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

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

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

Например, этот шейдер будет рендерить глубину своих объектов:

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
Текстура глубины камеры