WinCNT

Unity의 Depth Texture에는 실제로 어떤 오브젝트가 기록되는 걸까?(feat. SSAO) 본문

Unity/URP or Shader 관련

Unity의 Depth Texture에는 실제로 어떤 오브젝트가 기록되는 걸까?(feat. SSAO)

WinCNT_SSS 2024. 1. 22. 10:07

서론

Depth Texture를 구현해보던 중에 조금 의문이 생겨서 조금 조사해봤다

참고로 구현하려던 건 아래의 예제이다

Reconstruct the world space positions of pixels from the depth texture | Universal RP | 14.0.8

 

Reconstruct the world space positions of pixels from the depth texture | Universal RP | 14.0.10

Reconstruct the world space positions of pixels from the depth texture The Unity shader in this example reconstructs the world space positions for pixels using a depth texture and screen space UV coordinates. The shader draws a checkerboard pattern on a me

docs.unity3d.com


얘(?)는 왜 뎁스 텍스처에 기록이 안 되지?

의문점이란 작성한 Depth Texture를 출력하는 쉐이더(줄여서 뎁스 쉐이더)를 적용한 게임 오브젝트가 Depth Texture에 기록이 안 된다는 점이었다

예를 들어 다음과 같이 뎁스 쉐이더 오브젝트가 카메라 앞을 가리고 있는데도, 그 오브젝트는 무시하면서 다른 오브젝트들의 뎁스는 잘 캡쳐하고 있었다


그 이유는 바로 LightMode에 있었다(그리고 SSAO)

뎁스 쉐이더 오브젝트가 Depth Texture에 기록되지 않던 이유는 뎁스 쉐이더에 LightMode가 DepthOnly이거나 DepthNormals인 Pass가 없었기 때문이다

 

일단 설정한 URP Asset은 다음과 같은데, SSAO가 있으면 DepthOnly DepthNormals의 Pass의 값을 Depth Texture에 기록하고, 그걸로 SSAO를 처리한다

 

즉, 셰이더에 DepthOnly DepthNormals의 Pass가 없으면 Depth Texture에 기록되지 않는다는 것!

 

예를 들어 URP의 Lit를 적용한 오브젝트와 Lit에서 DepthOnly DepthNormals의 Pass만 삭제한 쉐이더를 적용한 오브젝트가 있으면 다음과 같이 렌더링 된다

  • 하얀색 : URP의 Lit 쉐이더
  • 빨간색 : DepthOnly와 DepthNormals의 Pass를 삭제한 쉐이더

 

반대로 뎁스 쉐이더에 "LightMode" = "DepthNormals”인 Pass를 추가하면 Depth Texture에 제대로 기록된다


URP 이치가 그래

그 이유는 그냥 URP가 그런 구조로 되어 있기 때문이었다

아래는 _CameraDepthTexture의 구현에 대해서 알아본 사람의 글인데 잘 정리되어 있었다

【Universal Render Pipeline】_CameraDepthTextureの実装を読んでみた - Qiita

 

【Universal Render Pipeline】_CameraDepthTextureの実装を読んでみた - Qiita

はじめにURP (Universal Render Pipeline)では、_CameraDepthTextureを利用することで画面のデプス情報(深度の情報)を取得することができます。今回は_…

qiita.com

그러므로 자세한 내용은 생략!


애초에 Camera Depth Texture는 카메라의 Depth Buffer가 아니다

DirectX 11에서, 그리고 대부분의 3D 그래픽스 라이브러리에서 Depth Buffer는 존재할 것이다

3D 공간에서 오브젝트의 선후 관계를 알기 위해 필요하기 때문이다

하지만 유니티의 Camera Depth Texture는 말 그대로 Depth의 값을 기록한 텍스처일 뿐, 렌더링에 사용되는 Depth Buffer 그 자체는 아니다

설령 Depth Buffer와 같은 값이라고 해도!

Skybox render queue value

 

Skybox render queue value

Hi, I'm currently trying to get a Skybox to be seen through a window. What I do is basically to attach a Skybox to the camera and then render the...

forum.unity.com

 

DX11로 자체 엔진 만들면서 3D 그래픽스 공부할 때 뎁스 값만 출력했던 영상이 있는데 이것과 비슷한 게 아닐까 싶다

여기서도 오브젝트의 뎁스의 값을 출력하고는 있지만 뎁스 버퍼를 출력한 건 아니었다


깊이 맵(Depth Map) 작성은?

사족으로 SSAO를 끄면 Depth Texture를 만드는 처리 자체가 사라진다

 

그렇다면 Depth Map을 만들기 위해서는 반드시 SSAO 설정해야 하고, 개별 셰이더에 각각 DepthOnly나 DepthNormals의 Pass도 추가해야 하나!?

호에에엥!

…이라고 처음에는 생각했는데 어찌저찌 더 간단한 방법을 찾았다

이에 대해서는 따로 정리하고자 한다!


마무리

정리하고 나니 막상 별거 없지만 모르고 있을 땐 진짜 이유를 몰라서 혼란스러웠다

그래도 이젠 납득이 가니 다행~!


참고 사이트

Reconstruct the world space positions of pixels from the depth texture | Universal RP | 14.0.8

 

Reconstruct the world space positions of pixels from the depth texture | Universal RP | 14.0.10

Reconstruct the world space positions of pixels from the depth texture The Unity shader in this example reconstructs the world space positions for pixels using a depth texture and screen space UV coordinates. The shader draws a checkerboard pattern on a me

docs.unity3d.com

Unity - Manual: Cameras and depth textures

 

Unity - Manual: Cameras and depth textures

Cameras and depth textures A CameraA component which creates an image of a particular viewpoint in your scene. The output is either drawn to the screen or captured as a texture. More infoSee in Glossary can generate a depth, depth+normals, or motion vector

docs.unity3d.com

【Unity】【シェーダ】カメラから見た深度を描画する - LIGHT11

 

【Unity】【シェーダ】カメラから見た深度を描画する - LIGHT11

カメラから見た時の深度を描画する方法です。

light11.hatenadiary.com

【Universal Render Pipeline】_CameraDepthTextureの実装を読んでみた - Qiita

 

【Universal Render Pipeline】_CameraDepthTextureの実装を読んでみた - Qiita

はじめにURP (Universal Render Pipeline)では、_CameraDepthTextureを利用することで画面のデプス情報(深度の情報)を取得することができます。今回は_…

qiita.com

Question - URP - Understanding _ScaledScreenParams and homogeneous clip space position

 

Question - URP - Understanding _ScaledScreenParams and homogeneous clip space position

Hello, I have a shader in URP that is working, but I do not understand why it is working. I compute homogeneous clip space position using...

forum.unity.com

Skybox render queue value

 

Skybox render queue value

Hi, I'm currently trying to get a Skybox to be seen through a window. What I do is basically to attach a Skybox to the camera and then render the...

forum.unity.com