일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래밍 기초
- Toon Shader
- OculusMotionVectorPass
- ColorGradingLutPass
- 3d
- URP
- C언어
- ASW(Application SpaceWarp)
- Cartoon Rendering
- 메모리 누수
- working set
- AppSW
- Rim Light
- Specular
- Windows Build
- Virtual Byte
- Cell Look
- Three(Two) Tone Shading
- Cell Shader
- URP로 변경
- Private Bytes
- 가상 바이트
- 게임 수학
- 벡터
- 작업 집합
- VR
- 개인 바이트
- Today
- Total
WinCNT
Unity의 Depth Texture에는 실제로 어떤 오브젝트가 기록되는 걸까?(feat. SSAO) 본문
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
얘(?)는 왜 뎁스 텍스처에 기록이 안 되지?
의문점이란 작성한 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
그러므로 자세한 내용은 생략!
애초에 Camera Depth Texture는 카메라의 Depth Buffer가 아니다
DirectX 11에서, 그리고 대부분의 3D 그래픽스 라이브러리에서 Depth Buffer는 존재할 것이다
3D 공간에서 오브젝트의 선후 관계를 알기 위해 필요하기 때문이다
하지만 유니티의 Camera Depth Texture는 말 그대로 Depth의 값을 기록한 텍스처일 뿐, 렌더링에 사용되는 Depth Buffer 그 자체는 아니다
설령 Depth Buffer와 같은 값이라고 해도!
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
Unity - Manual: Cameras and depth textures
【Unity】【シェーダ】カメラから見た深度を描画する - LIGHT11
【Universal Render Pipeline】_CameraDepthTextureの実装を読んでみた - Qiita
Question - URP - Understanding _ScaledScreenParams and homogeneous clip space position
'Unity > URP or Shader 관련' 카테고리의 다른 글
카메라와 오브젝트가 가까울 때 Dithering해서 반투명처럼 보이게 하는 셰이더 구현해보기! (0) | 2024.02.01 |
---|---|
URP에서 깊이를 기록하는 Depth Map 셰이더 만들어보기! + After Effect의 이미지의 레벨 조정(Levels adjustment) 흉내기기! (0) | 2024.01.23 |
MatCap 셰이더를 만들어보자 (0) | 2024.01.15 |
UniTask를 이용한 스크립트로 포스트 프로세싱이 아닌 Fade In, Fade Out를 구현해보기 (0) | 2023.12.15 |
URP에서 Cutout(Alpha Test) 구현해보기(feat. Alpha to Coverage) (0) | 2023.12.06 |