끈거
켠거
순차적으로 설명하겠음. 솔직히 코드 90%정도 배껴서 구현한거라 다 이해했다고 말하기는 창피하긴 하지만 일단 이해한 부분만 적음.
일단 다른 물체들을 전부 렌더한 텍스쳐와 뎁스 버퍼, 렌더할 때 사용한 뷰 행렬의 역행렬이 필요함.
이것들이 충족되면 우리는 렌더한 텍스쳐의 특정 픽셀이 뷰 공간에서 어떤 위치에 있는지 알 수 있음 (념글에 있는 Adria-DX12 참조)
여기서 레이 마칭이라는 개념이 나오는데, SDF고 뭐고 사실 나는 잘 모르겠고 우리가 구한 좌표에서 카메라까지 원하는 만큼 나눠서 전진한다고 보면 됨
쉐이더 지역 변수 중 rayEnd라고 있을건데, 걔가 0, 0, 0 좌표인건 뷰 공간에서 진행하니까 거기가 카메라 위치라서 그렇다.
쉐이더 코드 보면 뭐 외적하고 뭐하고 머리아프고 복잡할텐데 사실 걔네가 하는게 이게 다임. 나머지는 그냥 라이팅 계산이랑 똑같다.
전진한 위치에서의 빛을 계산하고, 그걸 계속해서 누적시키면 최종 결과물에서 얼마나 해당 픽셀이 밝아져야할지 계산 끝인거지.
그냥 점광원이면 점광원 계산식, 스팟 라이트 계산식이면 스팟 라이트 계산식을 적용하면 된다.
물론 샘플 수가 많아질수록 더 정확한 결과물을 내는건 당연한거고. 레이마칭 한번의 거리가 줄어드니까...
사실 여기서 Phase Function이나 Absorption같은 개념들을 적용시키는게 '제대로 된' 방법이고, PBR에 더 가까운 방식이긴 한데
나는 머리아프기도 하고 시간도 없고 이거 구현한다고 교수들이 좋게 봐줄거같지도 않아서 어느정도 야매로 했다... 설명하기도 빡쌔잖아
Adria-DX12의 볼류메트릭 스캐터링 코드는 광원 하나마다 드로우콜을 한번 씩 하던데 이거 되게 비효율적이고, 그냥 광원 정보들을 죄다 상수 버퍼에 올려서 컴퓨트 쉐이더로 돌리는게 훨씬 좋은 방법이다. 얘는 일부 후처리를 컴퓨트 쉐이더로 안하고 화면 전체를 덮는 쿼드를 이용해서 하는데 아마 옛날 코드를 참조했다던가 해서 그런 것 같다. 컴퓨트 쉐이더는 병렬로 돌아가니 당연히 이거 쓰는게 빠르지 않을까 싶다.
다들 화이팅 열심히하자
저번에 하던 거 잘 구현 했구나 굳!
Volumetric Scattering에 대해서 더 자세한 내용 알고 싶은 사람 있으면
https://sebh.github.io/publications/
세바스챤
아저씨가 시그랲 2015에서 발표한 내용( Physically-based and Unified Volumetric Rendering in Frostbite)를 보면 좋을듯. (또는 이걸 레퍼런스로 한 발표 내용들이나 구현들)
굳굳
나도 Volumetric Scattering은 나중에 구현할려고 계획중이라 좀 무섭긴 하네 ㅋㅋ 그래도 제대로 구현하면 그만큼 때깔 좋은 것도 없을 거 같아서 어려워도 열심히 해야지..
아 그리고 레이마칭-SDF는 최근 언리얼 엔진 5 Lumen 에서도 쓰인 GI 알고리즘 중 하나인 SDFDDGI(Signed Distance Field Dynamic Diffuse Global Illumination)의 기반이기도 하다니까 시간내서 공부해두면 나쁘지 않을 듯
레이마칭 자체가 용도가 다양하기도 하고..