Version: 2022.2
언어: 한국어
물리적 카메라 사용
카메라 트릭

카메라 및 뎁스 텍스처

Camera는 뎁스 또는 뎁스+노멀 또는 모션 벡터 텍스처를 생성할 수 있습니다.이는 포스트 프로세싱 효과에 사용하거나 커스텀 조명 모델을 구현하는 데 사용할 수 있는 최소 G-버퍼 텍스처입니다.

이러한 텍스처는 대부분 효과에 의해 사용됩니다. 예를 들어 포스트 프로세싱 효과는 많은 경우 뎁스 정보를 사용합니다.

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

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

  • Direct3D 11+(Windows), OpenGL 3+(Mac/Linux), OpenGL ES 3.0+(iOS) 및 Metal(iOS) 같은 잘 알려진 콘솔은 모두 뎁스 텍스처를 지원합니다.
  • OpenGL ES 2.0(Android)은 GL_OES_depth_texture 확장자가 있어야 한다고 요구합니다.
  • WebGL은 WEBGL_depth_texture 확장자를 요구합니다.

스크립트에서 Camera.depthTextureMode 변수를 사용하여 카메라의 뎁스 텍스처 모드를 활성화할 수 있습니다. 셰이더 대체 기능을 사용하여 유사한 텍스처를 직접 빌드할 수도 있습니다.

세 가지 뎁스 텍스처 모드가 가능합니다.

  • DepthTextureMode.Depth: 뎁스 텍스처
  • DepthTextureMode.DepthNormals: 텍스처 하나에 패킹된 뎁스 및 뷰 공간 노멀*
  • DepthTextureMode.MotionVectors: 현재 프레임에 대한 각 화면 텍셀의 픽셀당 스크린 공간 모션. RG16 텍스처로 패킹됩니다.

플래그이므로 위 텍스처의 조합을 자유롭게 지정할 수 있습니다.

DepthTextureMode.Depth 텍스처

화면 크기의 뎁스 텍스처를 빌드합니다.

뎁스 텍스처는 셰이더 캐스터 렌더링에 사용되는 것과 동일한 셰이더 패스(ShadowCaster 패스 타입)를 사용하여 렌더링됩니다. 따라서 셰이더가 섀도우 캐스팅을 지원하지 않는 경우(즉 셰이더나 폴백에 섀도우 캐스터 패스가 없는 경우), 해당 셰이더를 사용하는 오브젝트는 뎁스 텍스처에 표시되지 않습니다.

  • 셰이더가 섀도우 캐스팅 패스가 있는 다른 어떤 셰이더로 폴백하도록 합니다. 또는
  • 표면 셰이더를 사용하는 경우 addshadow 명령을 추가해도 섀도우 패스가 생성됩니다.

머티리얼과 셰이더가 렌더 대기열 <= 2500을 사용하도록 설정된 “불투명” 오브젝트만 뎁스 텍스처로 렌더할 수 있습니다.

DepthTextureMode.DepthNormals 텍스처

뷰 공간 노멀이 R&G 채널로 인코딩되고 뎁스가 B&A 채널로 인코딩되는 스크린 크기 32비트(8 비트/채널) 텍스처를 빌드합니다. 노멀은 스테레오그래픽 투사를 사용하여 인코딩되고 뎁스는 8비트 채널로 패킹된 16비트 값입니다.

UnityCG.cginc 포함 파일에는 인코딩된 픽셀 값에서 뎁스와 노멀을 디코딩하는 DecodeDepthNormal 헬퍼 함수가 있습니다. 반환되는 뎁스의 범위는 0–1입니다.

뎁스 및 노멀 텍스처 사용 방법에 대한 예시는 런타임 시 셰이더 교체포스트 프로세싱 및 전체 화면 효과의 앰비언트 오클루전을 참조하십시오.

DepthTextureMode.MotionVectors 텍스처

스크린 공간 픽셀 모션이 R&G 채널로 인코딩되는 화면 크기 RF16(16비트 플로트/채널) 텍스처를 빌드합니다. 픽셀 모션은 스크린 UV 공간에서 인코딩됩니다.

텍스처에서 샘플링하는 경우 인코딩된 픽셀의 모션이 –11 범위로 반환됩니다.이것이 마지막 프레임과 현재 프레임 사이의 UV 오프셋이 됩니다.

팁과 요령

카메라 인스펙터는 카메라가 뎁스 또는 뎁스+노멀 텍스처를 렌더링할 때 표시합니다.

카메라(Camera.depthTextureMode)에서 뎁스 텍스처가 요청되는 방법에 따라 해당 텍스처를 필요로 했던 효과가 비활성화된 후에도 카메라가 텍스처를 계속 렌더할 수 있습니다. 카메라에 여러 효과가 있고 각 효과에 뎁스 텍스처가 필요한 경우 개별 효과를 비활성화하면 뎁스 텍스처 렌더링을 자동으로 비활성화할 좋은 방법이 없습니다.

복잡한 셰이더나 이미지 이펙트를 구현할 때는 플랫폼 간 렌더링 차이를 기억해야 합니다. 특히 이미지 이펙트에 뎁스 텍스처를 사용하려면 종종 Direct3D+안티앨리어싱에 특수 처리가 필요합니다.

경우에 따라서는 뎁스 텍스처가 네이티브 Z 버퍼에서 직접 비롯됩니다. 뎁스 텍스처에 결함이 보이는 경우 이 텍스처를 사용하는 셰이더가 Z 버퍼에 쓰지 않도록 해야 합니다(ZWrite Off 사용).

셰이더 변수

뎁스 텍스처는 셰이더에서 전역 셰이더 프로퍼티로 샘플링하는 데 사용 가능합니다. _CameraDepthTexture라는 샘플러를 선언하여 카메라의 메인 뎁스 텍스처를 샘플링할 수 있습니다.

_CameraDepthTexture는 항상 카메라의 기본 뎁스 텍스처를 참조합니다. 반대로, _LastCameraDepthTexture를 사용해 카메라로 렌더링된 마지막 뎁스 텍스처를 참조할 수 있습니다. 예를 들어, 보조 카메라를 사용하여 스크립트에 절반 해상도 뎁스 텍스처를 렌더링하고 후처리 셰이더에서 사용할 수 있게 하려는 경우 유용할 수 있습니다.

모션 벡터 텍스처(활성화된 경우)를 셰이더에서 전역 셰이더 프로퍼티로 사용할 수 있습니다. ’_CameraMotionVectorsTexture’라는 샘플러를 선언하여 현재 렌더 중인 카메라에 대해 텍스처를 샘플링할 수 있습니다.

자세한 내용

뎁스 텍스처는 사용되는 렌더링 경로와 하드웨어에 따라 실제 뎁스 버퍼에서 직접 비롯되거나 개별 패스로 렌더링될 수 있습니다.일반적으로 디퍼드 셰이딩 렌더링 경로를 사용하는 경우 뎁스 텍스처는 G버퍼 렌더링의 산물이므로 “무료”로 얻을 수 있습니다.

DepthNormals 텍스처를 개별 패스에 렌더링하는 경우 셰이더 대체를 통해 렌더링됩니다. 따라서 셰이더에 정확한 “RenderType” 태그가 있는 것이 중요합니다.

MotionVectors 텍스처는 활성화된 경우 항상 추가 렌더 패스에서 비롯됩니다. Unity에서는 이동하는 게임 오브젝트를 버퍼에 렌더링하고 오브젝트의 모션을 마지막 프레임에서 현재 프레임까지 구성합니다.

물리적 카메라 사용
카메라 트릭