Graphics Programming

DXR 첫걸음 본문

Season 2

DXR 첫걸음

minseoklee 2022. 11. 16. 01:46

DirectX 12, RTX 그래픽카드, 하드웨어 레이트레이싱 가속 등이 처음으로 거론되던 시절에 레포지토리를 파놓고 4년 간 방치하다 이제서야 DXR 코딩을 시작했다.

처음으로 뭘 구현할까 고민하다 간접 스페큘러 리플렉션을 선택했다. 리얼타임 렌더링에서 래스터와 레이트레이싱을 섞어 쓰는 하이브리드 렌더링을 할 때 흔히 레이트레이싱으로는 RT Shadow, RTAO, RTGI(Diffuse GI), RTR(Specular GI) 등을 구현하는데 경험상 처음 3개는 레이트레이싱으로 인해 증가하는 비용에 비해 극적인 차이를 낸다고는 느끼지 못했다. 반면 RTR은 SSR + 리플렉션 큐브맵에서 아쉬웠던 문제점들을 깔끔히 해결한다.

프로젝트를 워낙에 방치했던 터여서 RTR 구현에 앞서 여러가지 선행작업이 필요했다.

  • 단일 버텍스/인덱스 버퍼로부터 메시별 suballocation 및 버퍼 오프셋 저장
  • 머티리얼 SRV와 CBV의 bindless 메커니즘
  • 컴퓨트 파이프라인 추상화
  • 컴퓨트 셰이더를 통한 gpu scene 관리
  • 간단한 forward shading + thin gbuffer 출력
  • FXC → DXC 으로 컴파일러 변경

그 다음 DXR 코딩에는 마이크로소프트의 DXR 샘플 들이 큰 도움이 되었다. 메시 지오메트리들을 긁어모아 BLAS, TLAS, RTPSO 등등을 생성하고 closest hit 셰이더에서 표면의 한 점에 대응하는 전역 버텍스/인덱스 버퍼, bindless CBV/SRV, gpu scene 정보를 읽어서 머티리얼 정보를 재구성하고 셰이딩에 반영한다. 셰이딩 계산은 대충 짰는데 또 Cook-Torrance 모델을 코딩하기는 지루하고 다른 셰이딩 모델을 시도해볼 생각이다. NPR을 시도해봐도 재밌을 것 같다.

이제 RTR 효과가 더 잘 드러나게 데모 씬을 가다듬고, 구현하는 과정에서 엉망이 된 추상화 레이어를 리팩토링해야 한다. 특히나 셰이더 리소스들을 관리하기 위한 래퍼 클래스들이 너무 엉망이여서 어떻게 정리할지 고민이다.

Comments