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

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

  • 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.
  • 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
카메라의 뎁스 텍스처