Graphics Programming

간만에 다시 꺼내든 CPU 레이트레이싱 본문

Season 2

간만에 다시 꺼내든 CPU 레이트레이싱

minseoklee 2022. 12. 11. 05:45

https://codeonwort.tistory.com/386

 

Ray Tracing: The Next Week

https://codeonwort.tistory.com/364 1부를 3년 전에 구현했는데 이제서야 2부를 읽고 있다. 맨날 놀다가 질리면 사이드 프로젝트들 중 하나를 골라서 잠깐 하는 것을 반복하니 영 진도가 안 나간다. 모션

codeonwort.tistory.com

이거 이후로 한동안 방치하다가 또 조금씩 깨작거리고 있다.

기가바이트 단위의 렌더링 리서치용 애셋들은 있지만 한 장 그릴 때마다 몇십 분씩 기다리기도 싫고 해서 또다시 McGuire의 간단한 Wavefront OBJ 모델들을 긁어와서 렌더링을 돌려보고 있다.

Cornell Box
Breakfast Room
Dabrovic Sponza
Fireplace Room

Wavefront OBJ 포맷 자체가 별로 잘 정의되어 있지 않아서 일단 렌더링을 해보고 결과가 이상하면 OBJ 파싱 또는 렌더링 로직을 고치고 있다. 끝까지 다 렌더링하려면 워낙 오래 걸리니 디버그 시각화용 모드를 따로 만들었다.

 

OBJ 파싱 디버깅을 위해 만든 vertex normal 시각화 모드

 

Breakfast Room과 Fireplace Room는 아직 global illumination을 제대로 구현하지 않은 내 OpenGL 프로젝트에서의 렌더링과 비교하면 꽤나 그럴 듯한 결과물이 나온다.

OpenGL 엔진에는 아직도 unoccluded sky IBL 밖에 없다. Scene capture 기능을 구현할 때 메인 카메라가 아닌 임의의 시점에서 장면 렌더링한 것을 별도 텍스처에 그릴 수 있게 아키텍처는 만들어놓았기 때문에, 라이트 프로브를 쭉 깔고 프로브의 시점에서 대충 6번 그려서 radiance 프로브를 생성하고, 필터링해서 irradiance 만들고 하면 되는데 귀찮...

CPU 레이트레이싱의 다음 작업으로는 디노이징을 생각하고 있다. 디노이징이 어떻게 작동하는지 전혀 모르기 때문에 이건 서드파티 라이브러리의 힘을 빌려야겠다. 언리얼 엔진의 패스 트레이싱 모드에서 인텔의 디노이저를 쓰는 것을 본 기억이 있어서 다시 방문해보니 빌드만 된다면 통합하기는 아주 쉽겠다. 노이즈 있는 이미지만 필수 입력으로 넣으면 되고, 옵션으로 albedo, normal 입력을 넣어서 디노이징 퀄리티를 향상시킬 수 있는데 마침 디버그 모드의 일환으로 구현했던 것들이다.

---

[2022/12/15] 인텔 OpenImageDenoise 를 붙여봤는데 빌드에 통합하기도 쉽고 디노이징이 상당히 깔끔하게 된다.

Fireplace Room (path tracing result)
Fireplace Room (denoised)

원래 렌더링하던 noisy image, albedo, normal 이미지를 float3로 덤프해서 디노이저에 넣으면 결과가 나온다. 역시 머신 러닝이 미래인가? 머신 러닝은 언제 해보나...

Comments