사용자 셰이더 GUI
카메라의 뎁스 텍스처

뎁스 텍스처 사용(Using Depth Textures)

각 픽셀에 고정밀도 뎁스 값이 포함된 렌더 텍스처를 만들 수 있습니다. 일부 효과에 씬의 뎁스가 필요한 경우 이 텍스처가 주로 사용됩니다. 예를 들어 소프트 파티클, 스크린 공간 앰비언트 오클루전 및 반투명에는 모두 씬의 뎁스가 필요합니다. 이미지 이펙트에도 뎁스 텍스처가 종종 사용됩니다.

픽셀 값은 0과 1 사이의 뎁스 텍스처 범위 안에 있고 비선형 분포를 나타냅니다. 정밀도는 설정과 사용 플랫폼에 따라 일반적으로 32 또는 16비트입니다. 뎁스 텍스처에서 읽는 경우 범위가 0과 1 사이인 고정밀도 값이 반환됩니다. 카메라와의 거리나 기타 리니어 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+(Android/iOS), Metal(iOS/Mac) 및 PS4/Xbox One 같은 콘솔은 모두 뎁스 텍스처를 지원합니다.
  • Direct3D 9(Windows)로 뎁스 텍스처를 얻으려면 “INTZ” 텍스처 포맷을 지원하는 그래픽스 드라이버가 필요합니다.
  • OpenGL ES 2.0(iOS/Android)은 GL_OES_depth_texture 확장자가 있어야 한다고 요구합니다.
  • WebGL은 WEBGL_depth_texture 확장자를 요구합니다.

뎁스 텍스처 셰이더 헬퍼 매크로

뎁스 텍스처는 대부분의 경우 카메라에서 뎁스를 렌더링하는 데 사용됩니다. UnityCG.cginc 포함 파일에는 이 사례에서 위의 복잡성을 처리하는 매크로가 몇 개 있습니다.

  • UNITY_TRANSFER_DEPTH(o): 버텍스의 아이 스페이스 뎁스를 계산하고 o 로 출력합니다(float2여야 함). 버텍스 프로그램에서 뎁스 텍스처로 렌더할 때 사용합니다. 네이티브 뎁스 텍스처가 있는 플랫폼에서는 Z 버퍼 값이 무조건 렌더링되기 때문에, 매크로는 아무 기능도 수행하지 않습니다.
  • UNITY_OUTPUT_DEPTH(i): i 에서 아이 스페이스 뎁스를 반환합니다(float2여야 함). 프래그먼트 프로그램에서 뎁스 텍스처로 렌더할 때 사용합니다. 네이티브 뎁스 텍스처가 있는 플랫폼에서 매크로는 Z 버퍼 값이 무조건 렌더링되기 때문에 항상 0을 반환합니다.
  • 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): 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.

For example, this shader would render depth of its objects:

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

참고 항목

사용자 셰이더 GUI
카메라의 뎁스 텍스처