Depth Textures의 사용
플랫폼 별 렌더링 차이

카메라의 깊이 텍스처

Unity에서 카메라는 깊이 또는 깊이+법선 텍스처를 생성할 수 있습니다. 이것은 최소한의 G-buffer(그래픽 버퍼) 텍스처에서 포스트 프로세싱 효과 또는 사용자 정의 라이팅 모델(예를 들어 라이트 Pre-Pass)을 사용할 수 있습니다. 카메라는 실제로 Shader Replacement 기능을 사용하여 깊이 텍스처를 빌드하기 때문에, 다른 그래픽 버퍼 설정이 필요한 경우에는 스스로 이것을 할 수 있습니다.

Camera.depthTextureMode 변수를 사용하여 카메라의 Depth Texture를 스크립트에서 활성화할 수 있습니다.

두 개의 사용 가능한 깊이 텍스처 모드가 있습니다 :

  • DepthTextureMode.Depth: depth texture입니다.
  • DepthTextureMode.DepthNormals: 깊이 및 뷰 공간 법선이 하나의 텍스처에 모여 있습니다.

DepthTextureMode.Depth 텍스처

이것은 화면 크기의 Depth Texture를 빌드합니다.

Depth texture is rendered using the same shader passes as used for shadow caster rendering (ShadowCaster pass type). So by extension, if a shader does not support shadow casting (i.e. there’s no shadow caster pass in the shader or any of the fallbacks), then objects using that shader will not show up in the depth texture.

  • Make your shader fallback to some other shader that has a shadow casting pass, or
  • If you’re using surface shaders, adding an addshadow directive will make them generate a shadow pass too.

Note that only “opaque” objects (that which have their materials and shaders setup to use render queue <= 2500) are rendered into the depth texture.

DepthTextureMode.DepthNormals 텍스처

이것은 화면 크기의 32비트(8 비트/채널) 텍스처를, 뷰 공간 법선이 R과 G 채널에 깊이가 B 및 A 채널에 각각 인코딩 된 형태로 빌드합니다. 법선은 Stereographic Projection(스테레오 투영)을 사용하여 인코딩되며, 깊이는 두 8 비트 채널로 압축된 16 비트 값입니다.

UnityCG.cginc include file에는 헬퍼 함수 DecodeDepthNormal이 있고, 깊이 및 법선을 인코딩된 픽셀 값으로 부터 디코딩합니다. 빈환되는 깊이는 0에서 1의 범위입니다.

깊이와 노멀 텍스처의 사용 방법은 Shader Replacement 예제 프로젝트의 EdgeDetection 이미지 효과 또는 Screen Space Ambient Occlusion Image Effect를 참조하십시오.

팁 & 트릭

Camera inspector indicates when a camera is rendering a depth or a depth+normals texture.

The way that depth textures are requested from the camera (Camera.depthTextureMode) might mean that after you disable some effect that needed them, the camera might still continue rendering them. Particularly with multiple effects present on a camera, where each of them needs a depth texture, there’s no good way to automatically “disable” depth texture rendering if you disable the individual effects.

복잡한 쉐이더와 이미지 효과를 구현할 때, 플랫폼의 렌더링 차이을 염두해 주세요. 특히 이미지 효과에서 깊이 텍스처를 사용하는 경우, Direct3D 및 안티 앨리어싱에서 특별한 처리가 필요합니다.

경우에 따라 깊이 텍스처는 기본 Z 버퍼에서 직접 오는 경우가 있습니다. 만약 깊이 텍스처 이미지의 혼란이 있는 경우, 그것을 사용하는 쉐이더가 Z 버퍼에 쓰지 않도록 하십시오. (ZWrite Off를 사용하십시오).

Shader Variables

Depth textures are available for sampling in shaders as global shader properties. By declaring a sampler called _CameraDepthTexture you will be able to sample the main depth texture for the camera.

_CameraDepthTexture always refers to the camera’s primary depth texture. By contrast, you can use _LastCameraDepthTexture to refer to the last depth texture rendered by any camera. This could be useful for example if you render a half-resolution depth texture in script using a secondary camera and want to make it available to a post-process shader.

내부 처리

Depth textures can come directly from the actual depth buffer, or be rendered in a separate pass, depending on the rendering path used and the hardware. Typically when using Deferred Shading or Legacy Deferred Lighting rendering paths, the depth textures come “for free” since they are a product of the G-buffer rendering anyway.

깊이 텍스처를 별도의 패스에서 렌더링하려면 이것은 Shader Replacement를 통해 할 수 있습니다. 그러므로 쉐이더에 올바른 “RenderType” 태그를 넣도록 합니다.

관련 항목

DepthTextureMode.Depth 텍스처

Depth Textures의 사용
플랫폼 별 렌더링 차이