Using Depth Textures

Desktop!

각 픽셀이 고도의 정확한 깊이 값을 포함하는 Render Textures를 생성하는 것이 가능합니다.(RenderTextureFormat.Depth를 참고하시기 바랍니다). 이것은 대부분 어떠한 효과들이 사용가능한 씬의 깊이를 필요로 할 때 사용됩니다 (예를 들어, 부드러운 입자들, 스크린 공간 주변의 흡착 그리고 반투명성 모두는 씬의 깊이를 필요로 합니다).

깊이 텍스쳐에서 픽셀 값들은 비선형의 분포를 가지는 0부터 1사이의 값을 가집니다. 정밀도는 사용되는 깊이 버퍼에 따라서 보통 24 또는 16 bit입니다. 깊이 텍스쳐로부터 읽을 때 0과 1 사이의 고도 정밀값이 주어집니다. 사용자가 카메라로 부터의 거리값이 필요할 때 또는 선형 값이 필요할 때 사용자는 그것을 수동적으로 계산해야 합니다.

Unity의 깊이 텍스쳐는 다른 플랫폼에서 다르게 구현됩니다.

  • Direct3D 9 (Windows)에서 깊이 텍스쳐는 본래의 깊이 버퍼이거나 아니면 하나의 채널의 32 비트 소수점 텍스쳐 입니다("R32F" Direct3D format).
    • 그래픽 카드는 그들이 작동하기 위해서 본래의 깊이 버퍼 (INTZ 포맷) 또는 소수점 포인트 렌더 텍스쳐를 지원해야 합니다.
    • 깊이 텍스쳐로 그릴 때 fragment program는 반드시 필요한 값을 결과로 내야 합니다.
    • 깊이 텍스쳐로 부터 그릴 때 색상의 빨강 컴포넌트는 높은 정밀 값을 포함합니다.
  • OpenGL (Mac OS X)에서 깊이 텍스쳐는 본래의 OpenGL 깊이 텍스쳐입니다(see ARB_depth_texture를 살펴보시기 바랍니다).
    • 그래픽 카드는 반드시OpenGL 1.4 또는ARB_depth_texture 확장형을 지원해야 합니다.
    • 깊이 텍스쳐는 표현되는 Z 버터 내용과 관련이 있습니다. 그것은 조각 프로그램으로부터의 결과를 사용하_지 않_습니다.

Using depth texture helper macros

대부분의 시간에 깊이 텍스쳐는 카메라로 부터의 깊이를 표현하기 위해 사용됩니다. UnityCG.cginc helper include 파일은 이런 경우에 위의 복잡함을 처리하기 위해 몇몇의 매크로를 포함합니다:

  • UNITY_TRANSFER_DEPTH(o): 꼭지점의 눈의 공간 깊이를 계산하고 그것을 o (float2이어야만 합니다) 안에서 결과값을 냅니다. 깊이 텍스쳐로 렌더링할 때 정점 프로그램에서 그것을 사용합니다. OpenGL에서 이 매크로는 Z 버퍼 값이 절대적으로 렌더되기 때문에 아무것도 하지 않습니다.
  • UNITY_OUTPUT_DEPTH(i): 눈의 공간 깊이를 i 로부터 리턴합니다 (float2이어야만 합니다). 깊이 텍스쳐로 렌더링할 때 조각 프로그램에서 그것을 사용합니다. OpenGL에서 이 매크로는 Z 버퍼 값이 절대적으로 렌더되기 때문에 아무것도 하지 않습니다.
  • COMPUTE_EYEDEPTH(i): 꼭지점의 눈의 공간 깊이를 계산하고 그것을 o 안에서 결과값을 냅니다. 깊이 텍스쳐로 렌더링_하지 않_을 때 정점 프로그램 안에서 그것을 사용합니다.
  • DECODE_EYEDEPTH(i): 깊이 텍스쳐 i로부터 높은 정밀값이 주어지면 해당 눈의 공간 깊이를 리턴합니다. 이 매크로는 i*FarPlane on Direct3D을 리턴합니다. OpenGL에서 그것은 카메라의 범위를 매치하는 값을 선형화하고 확장합니다.

예를 들어 이 쉐이더는 물체의 깊이를 렌더합니다:

Shader "Render Depth" {
SubShader {
    Tags { "RenderType"="Opaque" }
    Pass {
        Fog { Mode Off }
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 = mul (UNITY_MATRIX_MVP, v.vertex);
    UNITY_TRANSFER_DEPTH(o.depth);
    return o;
}
 
half4 frag(v2f i) : COLOR {
    UNITY_OUTPUT_DEPTH(i.depth);
}
ENDCG
    }
}
}

iOS!

이 특성은 iOS 타겟을 위해서 지원되지 않습니다.

Android!

< 이 특성은Android 타겟을 위해서 지원되지 않습니다.

역링크