본문 바로가기
Unity/Lighting&PP

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

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

 

 

 


 

 

   7. Ray Traced Global Illumination (RTGI)    

- 인상적인 레이트레이싱 기반 효과로는 Global Illumination(전역 조명)이 있는데요.
   다시 글로벌 볼륨에 해당하는 오버라이드를 추가할게요.
- 참고로 효과가 즉시 나타나지 않는다면 카메라의 기본 프레임 설정이 효과를

  렌더링 하도록 설정되지 않아서일 수 있습니다. 그러므로 이 박스를 꼭 체크해 주세요.

 

 

 

 

- 또한 씬의 머티리얼이 SSR과 SSGI의 영향을 받도록 설정해야 합니다.

 

 


 

 

1) 세 번째 방

- 씬 설정에 따라 먼저 레이트레이싱 GI가 라이트맵에 비해 강도가 낮다는 사실을 알아차리실 수 있는데요.
- 앞서 레이트레이싱 반사 효과에서 보여 드린 것과 마찬가지로 이를 방지하려면 Clamp Value를 높여서 광선이 더 높은 강도의 조명을 반환하게 만들면 됩니다.
- 물론 이렇게 하는 경우 시그널의 노이즈 양이 증가할 수 있어요. 그러나 이 부분은 나중에 샘플 양으로 손쉽게 조정할 수 있습니다.

 

 



- Unity가 방향 그림자를 처리하는 방식 때문에 카메라 위치에 따라 레벨의 어두운 부분에서는 빛 번짐이 나타날 수 있습니다.
- 이것도 쉽게 고칠 수 있는데 Ray Tracing Settings 오버라이드를 추가하고 Directional Shadow Fallback을 0으로 설정하면 됩니다.

 

 



- 오프라인 조명 베이킹과 렌더링에 이미 익숙하시다면 샘플과 반사 수를 늘릴수록 분산 조명 결과가 더 좋아진다는

  사실도 아실 거예요. 레이트레이싱에서도 마찬가지입니다.
- 그럼 베이크 된 라이트맵과 매우 비슷해집니다. 참고로 이 씬의 베이크된 라이트맵은 최대 6개의 반사를 사용하지만

  렌더링에 약 3분이 소요됩니다.
- 레이트레이싱의 중요한 장점이 하나 더 있는데 바로 픽셀당 조명을 구현할 수 있다는 겁니다.
- 반면 라이트맵의 경우 특정한 텍스처 해상도에 매이게 되죠.

 

 

 

- 지금까지는 레이트레이싱 GI에 Quality 모드를 사용했습니다.
  하지만 이 모드는 하이엔드 하드웨어와 시각화에 더 적합하며 프레임 속도가 잘 나오는 편은 아니죠.

 

 

 

 


- 따라서 게임과 같이 프레임 속도가 높아야 하는 경우를 위해 Performance 모드도 제공됩니다.
   이 모드에서는 반사와 샘플이 각각 1개뿐이죠.
- 물론 실내 씬을 사실적으로 표현하려면 간접광을 많이 반사해야 하니 이 모드는 한계가 있겠죠.
   하지만 잠시 후에 야외 조명의 경우에는 Performance 모드가 매우 적합하다는 걸 알 수 있을 거예요.

 

 

 

 

- 레이트레이싱 GI를 보여 드리기 위해 천장의 오목한 부분에 20,000 칸델라의 강력한 스포트라이트를 비추겠습니다.

 

 

 

 

- 지금은 RTGI가 비활성화되어있고, 씬을 다시 베이크 하지 않았으므로 스포트라이트는 간접 조명을 생성하지 않습니다.

- RTGI를 다시 켜 볼게요.





- 그러면 제가 스포트라이트를 움직일 때마다 조명이 올바르게 반사되고 실시간으로 업데이트됩니다.
- 따라서 인터랙티브 하게 작업할 수 있으며 몇 시간 동안 베이크가 완료되기를 기다리는 대신 

   조명과 머티리얼에만 집중하고 즉시 고품질의 결과를 얻을 수 있습니다.

 




- 또한 대리석 바닥의 색상을 변경할 수도 있으며 레이트레이싱 반사와 GI 덕분에 조명이 전체 환경에 반사됩니다.





- 천장과 벽 사이로 새어 나오는 불빛도 마찬가지고요.

- Emission Intensity를 400 니트에서 40 니트로 줄이면 조명도 이에 따라 업데이트됩니다.
- 물론 프레임 속도에 따라 업데이트 내용이 전파되기까지 시간이 걸릴 수도 있어요.
- 따라서 빠른 업데이트가 필요한 경우 반드시 사용할 샘플과 반사 수에 유의해야 합니다.

 

 


 

 

2) 두 번째 방

- 이제 두 번째 방을 살펴보겠습니다.
- 이 공간은 천장의 작은 개구부에서만 빛이 들어오므로 이 방에서 양호한 조명 결과를 얻으려면 샘플 수를 늘려야 합니다.
- 디노이저를 비활성화하면 샘플이 어떻게 생성되었는지 확인할 수 있습니다.

 

 



- IndirectDiffuseLighting 디버그 뷰로 전환하면 생성된 조명을 더 확실하게 확인할 수 있습니다.
- 여기서도 시간의 경과에 따른 조명을 평활화(Smoothness)하는 데 디노이징 단계와 시간적 누적이 얼마나 중요한지 알 수 있습니다.

- 성능을 높이려면 디노이징 패스의 해상도를 절반으로 낮출 수도 있는데 그러면 디노이징의 필터 반경을 높여야 할 수 있습니다.

 

 

 


- 어느 경우든 샘플이 8개고 반사는 단 1개이므로 라이트맵과 매우 비슷한 결과를 얻을 수 있으며

   픽셀당 GI의 장점을 활용할 수도 있어요. 라이트맵의 텍셀 해상도에 얽매이지 않고요.

 

 



- 앞서 언급했듯이 반사와 샘플을 1개씩만 제공하는 Performance 모드로 전환하면

  여기서는 좋은 결과를 얻을 수 없습니다. 직접 조명을 많이 받지 않으니까요.

 

 


 

 

3) 첫 번째 방

- 이제 첫 번째 방으로 가 봅시다.

- 이 공간은 대량의 직접 조명을 받으므로 완벽에 가까운 결과를 얻기 위해 많은 샘플이나 반사가 필요하지는 않습니다.
  보시다시피 라이트맵과 레이트레이싱 GI를 전환해도 큰 차이는 없으며 결과는 여전히 아주 좋죠.

 

 

 


- 따라서 이와 같은 경우에는 Performance 모드로 전환하는 것도 괜찮은 방법입니다.
  특히 게임에서요. 그래서 Performance 모드는 야외 환경에 매우 적합합니다. 대량의 방향 광원이 들어오니까요.
- 반면 Quality 모드는 실내 또는 오클루전이 더 많아 샘플과 반사도 더 많이 필요한 공간에 적합합니다.

 

 

 

 


 

 

 

 

  8. Ray Tracing Light Cluster   

- Unity의 레이트레이싱 반사와 전역 조명을 알아보기 전에 먼저 카메라 주변의 광원 클러스터를 살펴보죠.

 

 


- 클러스터를 시각화하기 위해 Debug 창으로 이동해 Lighting 탭에서 LightCluster 디버그 모드를 활성화합니다.
- 월드에 맞춰 정렬된 구조로 카메라 주변의 반사 프로브와 로컬 광원을 보여 줍니다.
- 레이트레이싱은 이 구조를 사용하여 광선이 표면에 도달할 때마다 로컬 광원이 무엇인지 나타냅니다.

 

 

 


- 카메라 클러스터의 범위를 변경하면 구조의 원리를 이해하기가 훨씬 쉬워집니다.
- 성능상의 이유로 범위는 최소화하는 것이 좋아요.

 




- 보시다시피 어떤 셀은 초록색이고 어떤 셀은 빨간색인데요.
- 빨간색 셀은 특정 한도를 초과하는 수의 광원이나 반사 프로브를 포함함을 나타냅니다.
   즉, 빨간색 셀에 포함된 화면상 픽셀은 특정 광원이나 반사 프로브가 누락되므로 셰이딩이 올바르게 나타날 수 없습니다.
   이로 인해 빛 번짐 현상이 발생할 수 있고요.
- 이 문제를 해결하려면 HDRP 에셋의 셀당 한도를 늘려야 합니다.
- 성능상의 이유로 이 값 또한 최소화하는 것이 좋습니다.

 

 

 

 

 


  9. Ray Traced Shadows   

1) Ray Traced Shadow

- 이어서 레이트레이싱 그림자를 소개할게요.
- 세 번째 방의 천장의 등을 숨기고 단일 점 광원을 사용해 보겠습니다.
- 실시간 애플리케이션에서는 섀도우 맵이 많이 사용됩니다. 

 

 



- 간단히 말해 섀도우 맵은 광원의 관점에서 렌더링된 뎁스 텍스처입니다. 그러나 섀도우 맵의 필터링은 복잡합니다.
- HDRP는 기본적으로 광원과 물체 간의 거리에 따라 그림자를 조절하는 PCSS 기술로 뛰어난 품질의 필터링을 제공합니다.
- PCSS는 자연스럽게 부드러운 그림자를 시뮬레이션하면서 동시에 섀도우 캐스터에 가까운 그림자는 선명하게 표현합니다 마치 현실에서처럼 요.

 

 


- 그러나 이 효과는 리소스 소모가 꽤 크므로 일반적인 하드웨어의 경우 대신 중간 필터링 품질을 유지하는 것이 좋습니다.
- 이처럼 필터링 품질을 조금 낮추면 그림자가 마치 비디오 게임처럼 보이며 섀도우 캐스터와의 거리에 관계없이 그림자의 흐리기가 일정하게 유지됩니다.

 

 



- 레이트레이싱 그림자 덕분에 부담이 덜한 대안으로 화질을 최대화할 수 있습니다.
- 화면의 픽셀은 광원을 향해 광선을 캐스트하고 광원과 광원이 닿는 부분 사이의 오클루더에 따라 그림자 값을 생성합니다.

 

 



- 보시다시피 그림자는 섀도우 캐스터 가까이에서는 선명도를 유지하는데요.
- 캐스터와 적용부 사이의 거리가 늘어날수록 점점 흐릿해지죠.

 

 

 


- 평소와 같이 분석할 광원의 반경을 늘려도 되며 광원이 클수록 그림자가 더 분산됩니다. 현실과 똑같이 말이죠.

 

 


 

 

2) Ray Traced Shadow: 반투명

- HDRP가 제공하는 한 가지 유용한 기능은 반투명 컬러 그림자를 생성하는 기능입니다.
- 같은 커피 테이블을 무대로 가져와 볼게요. 먼저 유리가 그림자를 적절하게 드리우게 만들어야 합니다.
- 가급적 모든 LOD에서요.

 

 

 

 

- 투명한 컬러 그림자는 광원 인스펙터에서 활성화할 수 있는데요.
- 단, 현재 이 효과는 방향 광원과 함께 사용해야 합니다.

 

 



- 그런 다음에는 머티리얼의 투과 컬러만 바꿔 주면 그림자 컬러도 이에 따라 바뀌죠.

 




- 유리의 불투명도를 변경하려면 베이스 맵이나 표면의 컬러만 업데이트하면 됩니다.

 


- 실시간 렌더링에서는 반투명 그림자 렌더링은 새로운 편에 속하는 효과입니다.

- 기존의 섀도우 맵 기법에서는 두 가지 그림자만 드리울 수 있었거든요. 

   완전히 불투명한 그림자 아니면 그림자가 없는 옵션뿐이었죠.
- 하지만 이제 HDRP 덕분에 투명한 머티리얼의 그림자를 물리 기반의 방식으로 시뮬레이션할 수 있습니다!

- 사랑해요 유니티!

 

 

 

 


 

 

  9. All in   

이 부분은 영상을 한 번 보는 것을 추천합니다. 


- 레이트레이싱은 크기가 비교적 작은 에셋의 조명 설정을 혁신합니다.
  레이트레이싱을 씬에서 활성화하면 별도의 설정 없이도 즉시 멋진 조명이 구현되죠.

- 사실 많은 시간을 열심히 투자해서 라이트맵을 생성하고 차량 주변에 반사 프로브를 배치해서

  비슷한 결과를 얻을 수 있기는 합니다. 다만 그렇게 설정한 조명은 이 영역에만 사용할 수 있겠죠.
- 만일 차량이 움직일 수 있다면 베이크 된 분산 조명과 스페큘러 조명이 바로 부정확해지겠죠.
  따라서 레이트레이싱은 화질과 반복 시간의 측면에서 아주 유용합니다.
- 마지막으로 한 번에 모든 레이트레이싱 효과를 활성화하면 리소스 소모가 매우 크다는 건 알아 두셔야 합니다.
  하드웨어에 따라 특정 효과 또는 대다수의 효과를 하향 조정해야 하죠.

- 예를 들어 게임과 같이 프레임 속도가 높아야 하는 경우 부담이 적은 레이트레이싱 기반 AO와 그림자만 사용하고
   나머지 조명에는 베이크된 GI와 반사를 사용할 수 있습니다. 레이트레이싱 반사와 GI도 상당히 부담이 되는 효과니까요.

 

 

 

 


  10. Path Tracing  

 

- 이 세션에서 다룰 마지막 효과는 패스트레이싱입니다.

- 레이트레이싱을 통합한 것과 비슷한 것으로 더 과감한 접근 방식을 사용합니다.
- 패스트레이싱도 볼륨 시스템으로 활성화합니다. 오버라이드만 추가하면 되죠.

- 원리는 꽤나 간단합니다. 카메라에서 광선을 발사하고 표면에 닿을 때마다.
  근처 표면과 광원 클러스터의 광원을 향해 또 다른 광선을 발사하는 것이죠.
- 패스트레이싱이라는 이름은 광원과 카메라 사이에서 발생하는 광선의 이동 경로를 '패스'라고 부르는 데서 왔습니다.
- 이 기법에서 주로 문제가 되는 건 바로 노이즈인데요.

- 하지만 시간이 지날수록 샘플을 누적해서 노이즈 없는 이미지를 만들 수 있죠.
- 화면 하단의 진행 표시줄에서 지금까지 누적된 프레임 수를 볼 수 있어요.

- 이 세션에서 보신 다른 레이트레이싱 기법 대비 패스트레이싱의 장점은 하나의 통합 프로세스로 조명의 모든 요소를 만들어 낸다는 거예요.
- 그림자, 반사, 굴절과 전역 조명 등을 모두 포함해서요.

 

 


- Maximum Depth 값을 늘려서 더 부드러운 간접 조명을 적용할 수 있죠.
- 어두운 실내의 경우 충분한 간접 조명을 받으려면 비교적 높은 뎁스 값이 필요하며 따라서 이미지를 통합하는 데 시간이 더 걸릴 수 있습니다.
- 아직 실시간 애플리케이션용으로 사용할 수 없는 기법인 까닭이 바로 이것 때문입니다.
   깔끔한 프레임을 생성하려면 보통 몇 초는 걸리니까요.
- 바깥으로 나가면 직접 조명을 훨씬 더 많이 받으므로 이미지가 매우 빠르게 잡힙니다.
- 단 몇 초만에 부드러운 그림자와 반짝이는 반사가 더해진 아름다운 조명이 구현되죠.

- 참고로 이 모드에서는 데칼이 지원되지 않습니다.



 

댓글