Graphics Programming

렌더링 챌린지 일지 2 본문

Season 2

렌더링 챌린지 일지 2

minseoklee 2022. 11. 5. 04:06

렌더링 챌린지 일지 1 을 작성한 것이 벌써 2년 전이다. 이 데모 씬(이하 RC1)를 내버려두고 다른 렌더링 테크닉만 구현해왔는데, 마무리를 짓고 다른 챌린지 월드를 만들어야겠다 싶어서 손질에 들어갔다.

 

리워크 중간 결과물

 

가장 최근에 작성한 일지인 AMD FSR1 통합 이후로 GLTF 로더, TAA 구현, 톤 매퍼 변경(Reinhard → ACES), CPU 프로파일러 개선, SSR 개선 등의 작업을 했고, 그 이후 RC1 손질을 시작했다.

 

타워 모델

벽돌 텍스처를 바르기 위해 triplanar mapping을 썼는데 노멀맵 계산이 틀려서 라이팅이 이상했었다. GPU Gems 3 - Generating Complex Procedural Terrains Using the GPU 을 참고해서 고쳤다.

 

번개 이펙트

좀 더 그럴듯하게 만들었다. 더 역동적으로 만들고 싶었지만 내가 테크니컬 아티스트가 아니라는 핑계로 이 정도에서 타협했다.

 

볼류메트릭 클라우드

2년 전에 어떻게 구름처럼 보이게는 만들었지만 사실 weather map, cloud coverage, cloud type, density gradient, shape noise, erosion noise 등 다양한 구성요소가 의도대로 조합되어서 구름 모양을 형성해야 하는데 전혀 그렇지 못했다. 예를 들어 weather map에서 cloud coverage가 높은 부분만 구름이 보이고, shape noise는 구름의 덩어리 모양을 결정하고, erosion noise는 작은 디테일만 더하는 역할을 해야 하는데 렌더링 결과물은 그렇지 않았다. 과거의 작업물은 여기저기 매직 넘버를 끼워넣어서 구름 모양이 나오게 했을 뿐이다.

 

그런데 지금 보니 이전 작업물도 나름의 아트 스타일이 있다. 새로운 렌더링 결과물이 코드는 더 올바르게 되었지만 비주얼이 '개선' 되었다고 말할 수 있을지 모르겠다.

 

이번에는 그런 것들을 모두 고쳐서 의도대로 작동하게 만들고 있다. 매직 넘버들을 최대한 걷어내고, 렌더링 퀄리티를 높이기 위해 추가 테크닉들을 도입했다.

 

Adaptive ray marching: 예전에는 레이 마칭 거리가 일정한 uniform ray marching을 썼다. 이제는 길게 전진(coarse march)하다가 구름을 만나면 짧게 전진(fine march)하고, 그러다 구름 영역을 벗어나면 다시 coarse march로 돌아간다.

 

Banding artifact: before 이미지 중 가운데 이미지에서 두드러지는 것처럼, 가로로 층이 난 것처럼 보이는 결함이 있었는데 엔비디아 STBN을 이용해 레이 마칭 시작 위치를 흔드는 것만으로 해결되었다. 노이즈를 줬음에도 지글거림이 느껴지지 않아서 조금 놀라웠다. 이 노이즈 라이브러리는 다음에 jittering이 필요할 일이 생기면 또 써봐야겠다.

 

구름에서 남은 작업은 레이 마칭을 더 개선하는 것과 볼륨 렌더링용 temporal reprojection을 구현하는 것이다. 마칭 횟수는 호라이즌 제로 던처럼 54 ~ 96번을 목표로 잡았지만, coarse march → fine march → coarse march를 하게 되면 이미 마칭 횟수가 별로 남아있지 않아 다음 구름까지 가지 못하고 마칭이 종료된다. 위 이미지들은 레이 마칭 횟수를 임의로 200~400번으로 크게 높여서 찍은 것이고, 원래 목표한 횟수인 54~96번으로도 화면 끝의 구름까지 마칭이 되려면 아직 조율을 더 해야 한다. 그리고 TAA에서 reprojection을 이미 구현해봤지만 이전 프레임에서 버텍스 위치를 정확하게 알 수 있고 벨로시티 버퍼를 자명하게 생성할 수 있는 TAA와 달리 볼류메트릭에서는 구름의 한 지점이 이전 프레임에 어디에 있었는지를 도출하는 것이 애매하다. 지상에서 하늘을 바라보는 거면 구름이 스카이박스처럼 무한히 멀다고 가정하고 reprojection을 하면 되겠지만, RC1은 구름이 초근접거리에 있어서 그런 가정을 할 수 없다. Fast temporal reprojection without motion vectors 에서 제시하는 솔루션이 내 상황에 딱이긴 한데 논문을 훑어보니 메모리를 너무 많이 쓴다. 화면 해상도와 같은 텍스처가 적어도 25장 필요한데 딸랑 reprojection에 메모리를 그만큼 태우기는 죠금 -_-;; 어쨌든 reprojection 안하면 렌더링 비용이 너무 크니 어떻게든 구현할 방법을 고민해봐야겠다.

 

스카이 박스 (TODO)

배경 텍스처는 아직 아무 작업도 못했다. 셰이더토이에서 galaxy, nebula 등으로 검색해서 예쁜 것들을 적당히 조합하려고 했는데 대부분 2D용 셰이더이고, 파노라마 형태로 억지로 늘려서 천구에 덮으면 이쁘지도 않고 타일링도 안 된다.

 

잘 알지도 못하는 서브스탠스 디자이너로 똥꼬쇼를 해보고 있기는 한데 만족할 만한 스카이 박스가 나올 지는 모르겠다. 다만 지금은 equirectangular map 형태로 만들어서 sphere에 프로젝션하고 있는데, 지상에서 지평선 위주로 바라볼 때나 적절한 방법이지 RC1처럼 아무 방향으로나 둘러보는 상황이면 텍스처 늘어지는게 너무 눈에 띄어서 큐브맵 텍스처로 익스포트해야 할 것 같다.

 

다시 손에 잡기까지 2년이나 걸렸는데 또 한눈 팔기 전에 RC1을 후딱 끝내야겠다. 사실 이미 compute shader 기반 테셀레이션에 한눈을 파는 중이다.

Comments