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

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

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

픽셀 값은 0과 1 사이의 뎁스 텍스처 범위 안에 있고 비선형 분포를 나타냅니다. 정밀도는 설정과 사용 플랫폼에 따라 일반적으로 32 또는 16비트입니다. 뎁스 텍스처에서 읽는 경우 범위가 0과 1 사이인 고정밀도 값이 반환됩니다. 카메라와의 거리나 기타 리니어 0–1 값을 구해야 하는 경우 헬퍼 매크로를 사용하여 수동으로 계산해야 합니다(아래 참조).

뎁스 텍스처는 대부분의 최신 하드웨어 및 그래픽스 API에서 지원됩니다. 아래에는 특별한 요구 사항이 나열되어 있습니다.

  • 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): 버텍스의 아이 스페이스 뎁스를 계산하고 o 로 출력합니다. 버텍스 프로그램에서 뎁스 텍스처로 렌더링하지 않는 경우에 사용합니다.
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i): i 에서 고정밀도 값이 주어지면 해당 아이 스페이스 뎁스를 반환합니다.
  • Linear01Depth(i): 뎁스 텍스처 i 에서 고정밀도 값이 주어지면 해당 리니어 뎁스를 0과 1 사이의 범위로 반환합니다.

참고: DX11/12, PS4, XboxOne 및 Metal에서 Z 버퍼 범위는 1–0이고 UNITY_REVERSED_Z가 정의됩니다. 다른 플랫폼에서 범위는 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
        }
    }
}

참고 항목

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