본문 바로가기
Unity/Lighting&PP

[Unity/HDRP] Ray Tracing (레이 트레이싱) 2

by 꿀팔자 2023. 3. 28.

[Unity/HDRP] Ray Tracing (레이 트레이싱) 시리즈는

Unity 공식 유튜브에 올라온 Pierre Yves Donzallaz (Technical Art Manager at Unity)가 발표한
'Activate ray tracing with Unity's High Definition Render Pipeline | NVIDIA webinar'
 영상을 기반으로 작성했습니다. 


* 영상과 포스팅은 유니티 버전과 목차 순서 그리고 내용이 살짝 다릅니다. 

  영상에서 사용된  Unity 버전   2020.2.1f1
  포스트에서 사용된  Unity 버전   2021.3.9f1
  Render Pipeline   HDRP
  목표   - HDRP의 주요 레이트레이싱 기능을 더 면밀하게 이해
  - 시각화뿐만 아니라 실시간 게임의 화질도 크게 향상

 

 

목차 포스트
  1. Introduction: Template
  2. Unity Installation (Unity 설치)
  3. HDRP Ray Tracing Setup (HDRP 레이트레이싱 설정)
  4. Volume Framework 
  [Unity/HDRP] Ray Tracing (레이 트레이싱) 1
  5. Ray Traced Ambient Occlusion (RTAO) 
  6. Ray Traced Reflections (RTR) 
  [Unity/HDRP] Ray Tracing (레이 트레이싱) 2 
  7. Ray Traced Global Illumination (RTGI) 
  8. Ray Tracing Light Cluster
  9. Ray Traced Shadows 
  10. All-in 
  11. Path Tracing 
  [Unity/HDRP] Ray Tracing (레이 트레이싱) 3

 

 

 


 

 

 

   5. Ray Traced Ambient Occlusion (RTAO)   

-  필요한 경우 탭 우측 상단에 있는 물음표 버튼을 클릭하면 공식 기술 자료가 열리며 여기서 해당 볼륨의 자세한 정보를 확인할 수 있습니다.

 

 

 

 


- 먼저 살펴볼 Ray Tracing(레이트레이싱) 기반 효과는 Ambient Occlusion(AO, 앰비언트 오클루전)입니다. 
- 이 Scene의 Global Volume은 이미 Ambient Occlusion 오버라이드를 포함하고 있는데요.
- 그런데 지금은 기존의 래스터화 기법을 활용하고 있어요.
- Ray Tracing(레이트레이싱) 을 활성화하려면 이 체크박스만 체크하면 됩니다.
- Ray Tracing(레이트레이싱)  AO가 벌써 적용된 거예요.

 

 

 

 

- 보통 AO는 은은한 효과이므로 더 잘 드러나게 하기 위해 스크린 공간 AO Debug View를 활성화해 볼게요. 
- [Window] > [Analysis] > [Rendering Debugger]을 선택하고 디버그 창을 엽니다.

 

 

 

 

 

- [Lighting] 탭에서 이 효과에 대한 전체 화면 Debug View를 활성화합니다.
- 이 Debug View 가 지글거려 보여도 이상은 없습니다. TAA(시간적 안티앨리어싱)이 적용되지 않았으니까요.

 

 

 

 

- 다시 래스터화된 스크린 공간 AO으로 되돌려 보죠.
- 게임에서 십수 년 전부터 사용된 기법입니다만, 이 기법의 가장 큰 문제는 뎁스 버퍼의 정보에만 의존할 수 있다는 것입니다.
- 즉, 오브젝트가 프레임을 벗어나는 순간 피사체는 어떤 오클루전도 생성할 수 없습니다.
- 예를 들어 이 트리 케이지가 화면에서 벗어나면 바닥에 어떤 오클루전도 생성할 수 없죠.

 

 

 

 

- 반면 Ray Tracing(레이트레이싱) AO는 광선을 화면에 보이는 것보다 더 멀리 쏘아 보낼 수 있습니다.

- 그러면 화면 밖의 오브젝트도 프레임 내에 오클루전을 생성할 수 있어서 Ambient Occlusion(앰비언트 오클루전)이 크게 개선됩니다. 

 





- Max Ray Length 값을 수정해 볼게요. 지금 기본적으로 들어가 있는 값이 커서 노이즈가 많이 생깁니다.  5로 수정해보겠습니다.

- Max Ray Length는 씬에서 광선이 몇 미터까지 뻗어 나갈지를 지정할 수 있습니다.
- 광선이 길수록 표면에 도달할 가능성이 높아지며 AO도 더 어두워지겠죠.
- 이미 조명이 양호하게 베이크 된 상황이라면 수치는 비교적 낮게 유지해 라이트매퍼가 생성하지 못한 마이크로 오클루전만 캡처하는 것이 좋습니다.

 




- Intensity를 늘리면 효과의 음영을 늘릴 수 있습니다. 이 항목은 가급적 낮게 유지하세요. 갑자기 인위적으로 어두운 간접 조명이 생길 수 있으니까요.

 




- 레이어 마스크 시스템을 사용하면 앰비언트 오클루전에 영향을 미치는 오브젝트를 지정할 수 있습니다.
- 예를 들어 초목을 Ignore Raycast라는 레이어에 배치해 보겠습니다.
- AO 패스에서 이 레이어를 제거하면 초목이 씬의 AO에 영향을 미치는 것을 방지할 수 있습니다.
- 이 레이어 시스템은 성능을 개선하거나 미관과 디자인 개선용으로 활용할 수 있어요.

 




- Sample Count도 늘려서 시그널 노이즈를 줄이고 디노이저를 더 용이하게 할 수 있습니다.





- 보시다시피 디노이징 없이는 이미지가 불안정해지죠. 프레임 간 샘플이 무작위로 생성되니까요.
- 따라서 디노이저와 시간적 안티앨리어싱이 아주 중요하다고 할 수 있겠습니다.

 




- 세 번째 방으로 가 보죠. 보시다시피 레이트레이싱 AO는 뛰어난 스페큘러 오클루전을 제공하는 데 매우 효과적입니다.
특히 어두운 곳과 금속 표면에서 두드러지죠.

 




- 의자 밑이나 화분 속을 살펴봐도 알 수 있는 부분이고요.

 

 

 


 

 

 

   6. Ray Traced Reflections (RTR)   

- 이제 레이트레이싱 반사를 알아보겠습니다. 여기서도 볼륨 오버라이드를 사용할 건데요.

 

 

 

 

- 이 효과를 완전히 비활성화하면 Unity는 씬의 반사 프로브에만 의존합니다.

 




- 모든 로컬 반사 프로브를 끄면 Unity가 스카이박스 자체의 반사로 폴백 합니다. 하늘 반사는 매우 강렬하게 보이죠.
- 따라서 로컬 반사 프로브를 씬에 올바르게 배치하여 빛 번짐을 방지하는 것이 중요합니다.

 




- 기본적으로 스크린 공간 반사 효과는 래스터화 기법을 사용하는데 이 기법은 프레임 정보에만 의존합니다.
- 예를 들어 Unity 공이 프레임에서 벗어나자마자 더 이상 물웅덩이에 반사되지 않죠.
- 보통 이러한 효과는 바람직하지 않으며 스크린 공간 반사는 원래 제약적인 요소가 많습니다.
- 그렇지만 동적 오브젝트와 연동이 가능하고 실시간 반사 프로브나 레이트레이싱 반사에 비해 훨씬 리소스 소모가 적습니다.
- 레이싱 게임을 예로 들면 특히 카메라의 상이 거의 대부분의 시간 동안 고정되어 있으므로 이 기법에 매우 적합합니다.

 

 

 


- 참고로 일부 반사가 충분히 밝지 않으면 광선이 반환하는 최대 강도를 높여 보세요.
- 단, 이 경우 반사의 노이즈가 증가할 수 있습니다.

 

 

 

 

- 머티리얼 Smoothness(평활도)와 관련된 주요 파라미터 두 가지가 있는데요.
- 이 두 파라미터는 머티리얼이 스크린 공간과 레이트레이싱 반사를 받기 전에 얼마나 Smooth(매끈)할 수 있는지 정의합니다.

 

 

 


- 따라서 실시간에 활용할 때에는 이 값을 최대한 높게 유지해야 성능을 최대화할 수 있어요.

 

 

 


- 여기서는 아직 래스터화 기법을 사용하고 있는데 바닥을 보면 기둥의 반사가 사라지는 것을 확인할 수 있습니다.



 

 

- 그럼 최대한 완벽한 결과를 위해 레이트레이싱 반사를 활성화해 보겠습니다.

 

 

 

 

- 지금은 우선 반사를 1회만 지원하는 Performance 모드를 선택하고 Quality 모드는 조금 이따 살펴볼게요.

 

 

 

- Max Ray Length라는 중요한 파라미터가 하나 있는데요.

 당연한 얘기지만, 광선이 표면에 도달할 수 있는 길이로 설정해야 합니다. 그렇지 않으면 빛 번짐이 발생할 수 있거든요.

 

 

 

 

- 샘플의 분포를 이해하실 수 있도록 몇 초 동안 디노이징을 꺼 보겠습니다.

- 성능을 향상하려면 프레임의 4픽셀당 1개 광선을 캐스트 하게 만드세요. 1픽셀당 1개 광선 대신에요.

 

 

 

 

- 그러면 분명 노이즈가 증가하므로 Denoise를 계속 켠 상태로 유지하고 Denoiser Radius를 조정해 양호한 결과를 얻어야 합니다.

 

 

 


- 앰비언트 오클루전의 경우 레이트레이싱 반사에서 특정 레이어 마스크를 사용하지 않게 설정할 수 있었습니다.

- 이 예에서 케이지 속 식물의 반사를 비활성화해 보겠습니다. 이 옵션은 미관이나 디자인 개선 및 성능 증대 목적으로 사용할 수 있습니다.

 

 

 

 

- 거울 머티리얼은 빨간색 색조로 준비했습니다. 씬과 거울에 반사되는 내용을 보다 쉽게 구분할 수 있게끔요.
- 또한 씬의 머티리얼은 SSR 및 SSGI의 영향을 받을 수 있도록 설정해야 합니다.

 

 

 

 

- 이전에 Volume Global에서 설정한 프로퍼티 Layer Mask를 Everything으로 변경해줘야 거울에 유니티 볼이 비칩니다. 

 

 

 

 

- 지금부터는 Quality 모드도 사용해 볼 텐데요. Quality 모드에서는 반사 수를 늘려서 더 정확한 반사를 얻을 수 있습니다.

 

 

 

 

- 비교를 위해 스크린 공간 반사를 완전히 꺼 보겠습니다.

- 거울이 여전히 월드를 반사하고 있는데요. 이 무대에 반사 프로브 몇 개가 베이크되어 있어서 그렇습니다.

 

 

 


- 재미 삼아 스크린 공간 반사를 켜 볼게요.
- 래스터화 기법을 사용하며 볼 만한 최악의 시나리오일 겁니다.
- 거울이 카메라 뒤와 프레임 밖에 있는 오브젝트를 반사하므로 어울리지 않는 기법이란 걸 알 수 있어요.
- 레이트레이싱을 활성화해 보면 결과가 완벽하지는 않더라도 훨씬 더 나아진 것을 확인할 수 있습니다.

 

 

 

 

- 먼저 카메라 절두체를 벗어난 몇몇 오브젝트의 그림자가 거울에서는 컬링되었는데요.

 

 

 

 

- Ray Tracing Settings 오버라이드를 추가하고 Extend Shadow Culling을 활성화하여 해결할 수 있습니다.

 




- 또한 거울에서 두 번째로 반사되는 모습은 올바르지 않거나 해상도가 낮죠.
- 현재 한 번의 반사만 사용하고 있으며 시스템이 이 예제에 베이크된 로컬 반사 프로브로 폴백하는데 해상도가 매우 낮기 때문입니다.

 

 

 

 

- 이 문제를 해결하려면 Bounce Count를 2, 3, 4로 늘리면 됩니다.
- 다만 반사 수는 신중하게 정해야 합니다. 성능에 매우 부담이 될 수 있기 때문이죠.
- 보통 1~2회 반사되면 충분한 결과를 얻을 수 있습니다. 특히 씬에 반사 프로브를 신중하게 배치했다면요.

댓글