[그래픽스] Ray tracing에서의 GBuffer사용의 의미

윤태웅·2022년 8월 16일
0

그래픽스

목록 보기
9/13

개요

DXR코딩을 진행하기 위해 SIGGRAPH 2018발표 자료를 읽다가 Ray Tracing 에서 GBuffer를 쓰는 것의 의의를 알게되어서 이 글을 작성한다.

GBuffer?

GBuffer는 Rasterization Rendering의 Two pass Algorithm인 Deferred Shading에서 나온 개념이다.Deferred Shading포스팅

DXR같은 실시간 Ray Tracing API에서도 이러한 Two Pass Algorithm을 사용한다.
첫번째 Pass에서 GBuffer에 Position,Normal,UV값들을 GBuffer텍스처에 기록하고
두번째 Pass에서 GBuffer에 기록된 값들을 바탕으로 추가적인 TraceRay콜로 Shadow,AO같은 Indirect Shading을 처리한다.

왜 쓰지?

Rasterization에서의 GBuffer는 성능상의 이득이 확실하게 이해가 되었다. 화면의 해상도보다 많은 Pixel데이터들을 첫번째 Pass를 통해 화면의 해상도 만큼의 Pixel데이터로 줄여서 Shading연산부하가 줄어들게 된다. 하지만, Ray Tracing에서는 이미 첫번째 Pass에서 가로*세로 Screen해상도 만큼의 TraceRay콜을 하게된다. 이 상태로 GBuffer를 만든다고 해도 그게 그거 아닌가? 라는 생각이 들었다.

하지만, GBuffer를 Rasterization방식 렌더링 파이프라인으로 만들게 되면 이야기가 달라진다.
GBuffer를 생성하기 위해서 화면 해상도 만큼의 TraceRay콜 대신 Rasterization알고리즘을 통하는 것이다. TraceRay함수는 BVH(bounding volume hierarchy)와의 충돌처리를 계산하는 매우 비싼 함수이다. 현대 GPU장치들은 해상도 만큼 TraceRay콜 연산의 overhead보다 Rasterization pass1번의 overhead가 훨씬 적다. 이것이 DXR같은 Ray tracing API에서 GBuffer를 사용하는 의의가 되겠다. 이것을 실제로 실험해본 한국인 블로그 글 링크도 첨부한다.

RayTracing GBuffer의 응용

GBuffer를 사용하면 다양한 꼼수들이 가능해지는데, 바로 Rasterization Shading기법들을 RayTracing Shading기법이랑 '짬뽕'시켜서 게임을 만드는 것이 가능하다.

위 짤은 언리얼4로 Ray Tracing을 적용한 한 게임의 그래픽 설정 창이다. 이 게임은 특징이 Ray Tracing그림자, 반사 를 설정해도 '게임 배경' 에만 Ray Tracing을 적용시키고 '캐릭터'에는 Rasterization방식의 렌더링을 한다. 그 이유는 당연히 성능상의 타협일 것이다.캐릭터에는 게임배경보다 더 연산복잡도가 높은 Shading연산을 해야 그럴싸해 보일 것이다.
이러한 짬뽕 구현이 가능한 이유는 GBuffer에 있다. 다음은 내가 추측한 이 게임의 렌더링 알고리즘이다.

  1. 첫번째 Pass에서 Rasterization pipeline으로 GBuffer 생성
  2. 두번째 Ray tracing Pass에서 해당 Pixel의 GBuffer값 조회
  3. 레이트레이싱 그림자,반사 옵션이 OFF인 경우-> Rasterization Shading
  4. 레이트레이싱 그림자 On,반사 OFF인 경우-> 게임 배경 Geometry면 Shadow Ray로 그림자 판단. 나머지는 Rasteriation Shading
  5. 레이트레이싱 그림자 On,반사 On인 경우-> 게임 배경 Geometry면 Shadow Ray, Reflection Ray로 Shading,나머지는 Rasterization Shading

0개의 댓글