에픽게임즈가 대기산란(Atmospheric scattering)모델을 구현한 방식을 설명하는 논문이 하나 있음.

https://sebh.github.io/publications/egsr2020.pdf

이걸 Vulkan으로 구현하기 도전하고 있다.


한창 바다 렌더링 하고 있는데.

바다 표현 셰이딩 할 때 하늘 색깔이 엄청 중요한 역할을 하더라고.

그래서 하늘 렌더링 먼저 해놓고 바다 표면 렌더링까지 하고나면 엄청 멋있는 영상 만들어질 것 같다.


기본적으로 대기산란은 리얼타임으로 렌더링 하는게 엄청나게 어려움.

레이트레이싱으로 생각해보자.

태양에서 발사된 광선은 물체에 부딪쳐 반사되어 우리 눈으로 들어오면 우리는 색깔을 인지하게 됨.

이때, 흰색 광선이 물체와 부딪치면서 해당 물체 표면의 재질에 따라 색깔이 바뀌는데, 이것을 수학적으로 표현한 게 BRDF(Bidirectional reflectance distribution function)이고 좀더 대중적으로는 물리기반렌더링(PRB)로 알려져 있음.

BRDF 함수로 얻은 색깔이 눈에 닿으면 우리가 사물의 색을 인지하는 것이고, 그 색깔대로 픽섹을 색칠하면 그게 물리기반렌더링임.


그런데 현실세계에서는 물체 표현에서 딱 한번만 빛이 충돌하지 않는다.

태양과 물체 사이, 물체와 카메라 사이에는 무수히 많은 먼지, 오존 등 기체, 액체, 고체가 존재한다.

대기산란을 정확히 계산하려면 빛의 이동경로 모든 곳에서 대기 물질과 광선이 충돌하여 손실되는 빛의 양을 계산해야 한다.

그뿐만이냐?

원래는 눈으로 들어오지 말았어야 할 광선이 대기 물질과 충돌하여 눈쪽으로 날아오는 경우도 계산해내야 한다.


위 내용을 한마디로 표현하자면, 색깔을 결정하기 위해 계산해야 하는 정보의 양이 어마어마하게 많다는 것이 문제다.

그래서 수많은 공돌이들은 대기산란모델 방정식의 최대한 많은 부분을 미리 계산해서 텍스처로 저장한 뒤 이를 재사용하는 방향으로 발전해옴.

그중에서 나는 에픽게임즈가 언리얼엔진에서 사용한 모델을 선택했다.


아직은 그저 코드 복붙만 해놓고, 다렉X11로 구현된 코드를 Vulkan으로 번역한 것에 불과함.

어느 정도 작동하는 프로그램부터 완성한 다음 수학적 배경은 천천히 익혀나갈 생각임.

Tessendorf 바다 렌더링 공부할 때 수학부터 마스터하려고 지랄하다가 꺾일뻔한 기억이 있어서 이번엔 반대로 할 예정임.

좀 더 자세한 내용은 공부해서 다시 글을 쓰도록 하겠다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ce882fa1bd62531c0a64993133e134c29906eec9891027c3a69d9c7bf65e0962893ce3a2b168f6daed7c313dfe4687fc7d9025a330bf464757fb8bb0f


이건 transmittance라고, 빛이 얼마나 손실되지 않고 전달되었는가를 나타내는 0~1 사이의 값인데.

시발 가로세로가 무슨 의미인지는 이제부터 알아봐야 된다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ce882fa1bd62531c0a64993133e134c29906eec9891027c3a69d9c7bf65e0962893ce3a2b168f6daed7c313dfe4687fc7da01096356f133aae71029c9


이건 Multi scatter 텍스처인데.

대충 논문 내용에 따르면 빛이 산란될때 Rayleigh나 Mie의 모델과는 다르게 모든 방향으로 균일하게 산란된다 가정하면.

대기중에서 여러번 튕겨지는 빛의 양을 알수있다 그러는데.

뭔소린지 조또 모르겠으므로 이것도 공부해야 한다.


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ce882fa1bd62531c0a64993133e134c29906eec9891027c3a69d9c7bf65e0962893ce3a2b168f6daed7c313dfe4687fc7dd025b3752f536e3df7dbf48


이건 졸라 알기쉬운 건데.

가로세로가 무슨 의미인지는 잘 모르겠는데.

대충 이 텍스처 샘플링해서 하늘에 그대로 갖다 박으면 된다.

보면 알겠지만 텍스처 크기가 다들 작아서 런타임 성능을 적게 먹는다.

게다가 대기산란 특성상 색깔이 부드럽게 변하므로 해상도가 낮다고 해서 튀어보이는 부분이 적다.


그럼 아래와 같은 모습이 된다.



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73ce882fa1bd62531c0a64993133e134c29906eec9891027c3a69d9c7bf65e0962893ce3a467a8b6b866c66643acab95a7cc960ab502ec21e17aa4347


사실 하늘 색깔 정하는것만 되어있지.

산이나 물체가 대기산란에 의해 흐려지는 부분은 아직 시작 못했다.

논문 내용에 따르면, 그냥 대기산란에 의해 흐려지는 색깔을 32x32x32 3차원 텍스처에 저장한 뒤 이를 그대로 사용하는 모양이다.

이것까지 완성하고 나면 바다 표면 셰이딩 공부를 할 것이며, 그러면 정말 아름다운 영상을 만들수 있을거 같다.


002