Real-time Volumetric Cloudscpes를 Voxel Horizon에 적용했다.
내 엔진에는 하늘과 구름을 자동으로 생성해주는 기능이 없다. 고전적인 디자이너가 모델링 하는 스카이박스를 사용해왔다. 최근 몇년간 도움을 받을 아트 디자이너도 구할 수 없었고, 앞으로도 없을것이기에 하늘과 구름을 코드로 생성해줘야겠다고 생각했다.
2005년 즈음에 Game Programming Gem에 수록된 ‘펄린 노이즈를 이용한 절차적 구름 생성기법’이란 챕터 제목을 기억하고 있었다. 이걸 사용해서 구름을 좀 만들어볼까 하고 자료를 찾아보니 너무 오래된 자료라 그런지 소스코드도, 자세한 문서도 찾을 수 없었다. 우여곡절 끝에 그 시절 책의 부록 소스를 구했는데 애초에 제대로된 소스코드는 들어있지 않았고 실행 파일과 동영상 데모만 들어있었다. 15년전 실행파일인데 돌아는 가서 내용을 좀 보니 스카이박스에 비해서도 한참 떨어지는 형편없는 품질이었다. 이걸 쓰느니 스카이박스를 쓰지. 그래서 다른 방법을 찾아봤다.
사실 펄린 노이즈와 구름으로 검색하면 Horizon zero dawn의 하늘과 구름처리 기법이 금방 나온다. 내가 만들려는 게임은 리얼한 그래픽을 추구하지는 않으므로 ‘이렇게까지는…필요없지’라고 생각해서 그냥 넘겨버렸지만, 2005년도 방식을 쓰지 않겠다고 생각하니 요새 기술을 받아들일 수 밖에 없었다.
Horizon Zero Dawn 발표자료와 관련된 해외논문, 이 자료들을 요약/번역한 국내 표절논문을 읽고나서 대충 어떻게 작동하는지는 이해했다. 그래도 실제로 구현하려니 막막했는데 고맙게도 이 기술(완전히 같지는 않다)을 적용한 데모의 풀소스를 올려놓은 이가 있었다.
https://github.com/fede-vaccaro/TerrainEngine-OpenGL
이 소스는 OpenGL기반 코드고 내 엔진은 DirectX 기반이지만, 일단 돌아가는 코드에 브레이크를 찍어가면서 분석할 수 있으므로 큰 도움이 됐다. 이 데모를 통해서 문서에서 언급한 각 단계의 기법들이 코드에서 어떻게 구현되는지 알 수 있었다. 다만 코드 작성자가 여기저기서 코드를 갖다 붙인거 같은데 내용을 잘못 이해하고 붙인 코드들이 좀 있는것 같다. 뭐 그래도 큰 도움이 되었다.
몇 일의 삽질 끝에 대충 구현해서 돌아는가게 만들었다. 물론 지속적인 튜닝이 필요하다. ray marching때문에 성능을 꽤 잡아먹긴 하는데 일단 내 엔진/게임 기준으로는 충분히 사용할만한 성능이다. 어차피 프레임 레이트는 남아돌았으니까.
여담으로 3종의 노이즈 텍스처를 만들어서 쉐이더 안에서 ray marching 한다는 아이디어도 엄청 내단하다고 생각했는데 플라이트 시뮬레이터 2020을 해보니 열배는 더 놀랍다. 구름을 눈으로 보기엔 그럴싸하게 만들수는 있지만, 플심의 구름은 그럴싸하게 보일뿐만 아니라 무려 실제 날씨를 반영해서 시뮬레이션한다.
