DXR – RTAO와 denoising

DXR 시작할때는 RTAO와 denoising을 구현할 생각이 없었다. ray tracing이 렌더러의 미래라고 생각하니까 DXR 기반의 프레임워크만 구축하면 충분했다. 시각적으로는 반사를 이쁘게 처리할 수 있으면 그걸로 족했다.
하다보니 사람이 욕심이 생기더라. 원론적인 ray tracing만 해서는 반사처리 외에 다른 시각적인 요소는 향상시킬 여지가 없었다.
내 프로젝트는 아트 디자이너의 도움을 전혀 받지 못하니 이 그래픽의 썰렁함을 조금이라도 극복하려면 렌더링 코드를 향상시키는 수 밖에 없다.
path tracing은 어차피 느려서 못쓰고 ray tracing을 이용해서 좀 자연스러운 효과를 줄 수 있는게 RTAO였다.

RTAO 자체는 구현이 쉽기 때문에 시험삼아 구현을 해봤다. 역시나 노이즈가 별의 바다처럼 나오니 denoising을 안하고 넘어갈수는 없었다. 이미지 프로세싱은 내 관심 분야가 아니다. 당연히 denoising도 관심 분야가 아니고 시간을 투자하고 싶지 않았다.

간단하게 붙일 수 있는 라이브러리가 있나 해서 꽤 찾아봤는데 쓸 수 있는게 nvidia optix정도였다. 한 일주일 걸려서 optix을 붙이긴 했는데 성능이 개떡같아서 게임에는 쓸수가 없었다. CPU로 하는것보단 빠른 모양인데 그건 오프라인 렌더링 소프트웨어서나 쓸모가 있는거고 게임에선 못쓴다.
머신러닝 기반이라길래 학습된 결과를 적용하기만 하는거니까 뚝딱 처리될줄 았다. 크게 실망했다.

optix로 denoising을 시도했다가 똥같은 결과를 보고나서 그냥 RTAO는 포기할까 꽤 진지하게 고민했다.
AO만 놓고 봤을때 기존 방식 그대로 SSAO를 쓸 수도 있었다. 물론 RTAO가 품질이 더 좋고 활용여지도 많지만 그렇다고 그 차이가 대단히 큰 것도 아니다.
다만 기왕 DXR을 시작했으니 path tracing까진 아니어도 AO정도는 ray tracing으로 제대로 구현해줘야 하지 않겠나 싶었다.

결국 MS샘플에 딱 하나 들어있는 denoising 코드를 보기 시작했다. 이게 SVGF라는 기법이란것도 다른 자료 찾다가 알았다.
SVGF기법은 제대로 이해하지 못했다. 이해하지 못하고 구현만 했다. 여기 사용된 수학과 이미지 프로세싱 지식을 어느 세월에 학습하냐. 관심분야도 아닌데. 찝찝하긴 한데 denoising을 넣겠다고 하면 이 방법밖에 없었다.

그럼에도 꽤 오래 걸렸고 힘들었다. 코드를 짜는데 있어선 힘들다는 표현은 잘 안쓰는데 힘들었다.
남의 코드 분석하는거 별로 좋아하지 않고 잘하지도 못한다. 하지만 장담컨데 남의 코드 잘 보는 사람이라도 이거 뜯어다 본인 프로젝트에 맞게 붙이려면 쉽지 않을걸.

RTAO와 deoising을 위해서 뽑아낼 G-Buffer 리소스만 해도 대여섯개가 된다. 그걸 4-5번에 걸쳐 가공한다.
denoising에 필요한 쉐이더 코드만 해도 십수개고 쉐이더 하나하나마다 입력과 출력으로 제공되는 리소스(쉽게 말해 렌더타겟 버퍼)가 적게는 3개부터 많게는 12개씩 들어간다.
수학연산의 결과가 이미지 버퍼에 기록되는데 그런 버퍼가한 30개 이상 되니 디버깅 하려니 죽을 지경이었다.
게다가 픽셀포맷이 다 제각각이고 0에서 1사이로 정규화된거 안된거 등등 워낙 다양하게 있으니 이게 제대로 결과가 나온건지 확인하기도 너무 어려웠다. PIX에서 픽셀 하나씩 콕콕 찍어서 포맷 바꿔가며 값을 확인할 수 있어서 그나마 다행이었다.
D3D12코드는 안그래도 양이 많고 난해한데 예제 작성자가 지한테만 편한 wrapper 클래스를 덕지덕지 만들어 붙여놔서 그것도 뜯어서 다시 짜느라 애먹었다. 예제는 제발 좀 원래의 API만 써서 평평하게 짜줬으면 좋겠다.

대량의 코드를 짜고나서야 디버깅을 시도할 수 있는, 내가 가장 싫어하는 케이스다. 대체로 이런 경우는 제대로 작동하지 않는다. 전체 공정을 여러개의 짧은 공정으로 쪼개서 중간중간 디버깅이 가능해야하는데 이 작업은 잘게 쪼갤수가 없었다.

남들은 출퇴근만 해도 월급이 들어오지만 난 매일 내 돈을 써가며 10원도 못버는 프로젝트를 진행한다. 진도가 잘 나가도 마음이 편치 않은데 진도 못나가고 있으면 많이 괴롭다. 그래서 이 빌어먹을 denoising때문이 지난 2주간 진짜 괴로웠다. 진도는 안나가고 어디 물어볼데도 없고 해야되나 말아야되나 계속 고민되고.

여튼 이젠 게임에 적용할 수 있다는 확신은 생겼기 때문에 약간 후련한 기분으로 후기를 작성해본다.
당분간은 게임하는 기분으로 소소한 문제들을 해결하고 코드를 리팩토링한다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중