대장장이의 애트머스피어 스캐터링

더 블랙스미스의 기획 단계 초기에는 내장된 포그 옵션보다 조금 더 디테일하고 제어할 수 있는 대기 스캐터링 솔루션이 필요하다는 것을 알고 있었습니다. 특히 영화에서 좀 더 광활한 장면에서 항공 원근 효과를 강조하고 싶었습니다.

프로젝트의 스캐터링 솔루션을 개발하기 시작하면서 처음에는 니시타 토모유키[1]의 여러 논문에서 제시된 시뮬레이션 모델을 구현하고 실험해 보았습니다. 여러 가지 샷을 실험하고 프로토타입을 만든 후, 결국 단편 영화의 각 샷에 대해 광범위한 예술적 제어가 가능한 모델을 목표로 하는 것이 더 낫다고 결정했습니다. 저희는 물리적 모델의 주요 요소에 근접하면서도 필요에 따라 모든 규칙을 위반할 수 있는 솔루션을 원했습니다. 또한 단편 영화의 런타임 성능에 큰 영향을 미치지 않는 솔루션이 필요했고, 대부분의 계산을 픽셀 단위가 아닌 버텍스 단위로 수행할 수 있도록 목표를 설정했습니다.
저희는 물리 모델에서 레이레이와 미에 산란의 결합 효과를 모방하는 것을 목표로 설정했습니다. 또한 다양한 유형의 저고도 산란 효과를 나타내는 세 번째 요소를 추가했으며, 이를 통칭하여 높이 산란이라고 명명했습니다. 물리 기반 모델과의 또 다른 주요 차이점은 하늘과 구름을 절차적으로 생성하는 대신 HDR 하늘 텍스처를 계속 사용하기로 했다는 점입니다. 분명한 단점은 다이내믹 타임 오브 더 데이즈와 같은 설정이 조금 더 복잡해진다는 점이지만, 주요 장점은 하늘을 완전히 예술적으로 제어할 수 있다는 점입니다.
레이리 산란
대기 중 햇빛의 레이레이 산란은 낮 하늘의 밝은 푸른 색조와 일출과 일몰 시 태양과 지평선이 붉어지는 이유입니다.
에뮬레이션에서는 태양 자체를 생략하고 태양광의 입사 및 산란에 의해 생성되는 색상과 소멸을 모델링하는 데만 집중했습니다. 태양의 시각적 표현은 하늘 텍스처, 미에 스캐터링의 일부, 태양 플레어 스프라이트 또는 이 둘의 조합으로 추가할 수 있습니다. 가장 간단한 핵심은 레이리 산란의 밀도를 레이리 위상 함수에 의해 변조된 미화된 지수 함수로 요약할 수 있습니다. 하지만 데이터에 입력되는 데이터와 데이터에서 추출하는 데이터를 추가로 제어할 수 있습니다. 대기를 통과하는 다양한 파장의 빛을 모델링하지 않기 때문에 계산하는 밀도는 스칼라 값입니다. HDR 컬러 램프를 사용하여 수평선과 정점을 향해 산란되는 빛의 색조를 다르게 하고, 거리 인식 기능을 사용하여 최종 색조를 구성합니다.

미에 산란
대기 중 햇빛의 산란은 태양 주변의 밝은 후광, 구름의 회색빛, 오염된 도시에서 볼 수 있는 연무의 원인이 됩니다. 거의 균일한 모양으로 빛을 산란시키는 레이리 산란과 달리 미에 산란은 정방향성이 강합니다.
에뮬레이션에서 미에 산란은 주로 태양 주변의 안개와 후광을 표현하도록 했습니다. 따라서 레이일리 에뮬레이션이 태양을 무시한다는 사실을 보완하기 위해 거의 항상 색을 칠합니다. 기술적으로 레일리 함수와 미에 함수는 매우 유사하지만, 출력에 적용되는 위상 함수가 가장 큰 차이점입니다. 다른 많은 구현과 마찬가지로, 미에 산란의 이방성 또는 전방 방향성을 제어하기 위해 Henyey-Greenstein 산란 함수를 사용합니다.

연구 논문을 읽은 사람들은 우리가 각 에뮬레이션에 포함시키는 내용에 특정 '자유'를 부여한다는 점을 감안할 때 우리가 선택한 이름에 대해 비웃을 수도 있습니다. 우리는 사람들이 일반적으로 '하늘 산란'을 설명할 때는 레이리(Rayleigh)라는 이름을, '태양 연무'를 설명할 때는 미에(Mie)라는 이름을 사용하는 것을 일찍 발견했고, 구현 모델이 물리 모델에서 단순화된 이후에도 이 이름을 계속 사용하기로 결정했습니다.
높이 스캐터링
높이 산란 요소는 방사선 안개, 지상 안개, 낮은 구름 등 다양한 저고도 산란 효과를 혼합하여 표현합니다.
높이 산란의 구현은 매우 간단합니다. 정의된 해수면과 높이 감쇠를 통해 높이 밀도를 계산합니다. 그러면 거리 기반 지수 밀도의 스케일이 조정되고 전체가 원하는 색상으로 채색됩니다.

스캐터 오클루전
산란 기여도는 주로 태양빛이 관측자를 향해 산란하거나 관측자로부터 멀어지거나 관측자로 향하는 도중에 입자에 흡수되어 발생하므로, 물체가 태양빛을 차단하고 있다면 어떤 일이 발생해야 한다는 것은 당연한 일입니다.
이러한 경우를 처리하기 위해 디렉셔널 라이트의 캐스케이드 섀도 맵을 레이 마칭하여 레이를 따라 오클루전의 양을 화면 밖의 축소된 버퍼에 누적합니다. 출력 픽셀에 스캐터링을 적용할 때 가장자리 인식 필터로 이 오클루전 맵을 업샘플링하여 픽셀의 최종 색상을 구성하는 데 사용합니다. 이 결합 단계에서 약간의 문제가 발생하는데, 솔루션이 단일 산란만 지원하기 때문에 모든 산란광을 마스킹하면 매우 어둡고 부자연스러운 이미지가 남을 수 있습니다. 또한 더 복잡하고 비용이 많이 드는 다중 산란을 처리하기 위해 솔루션을 확장하고 싶지 않았습니다. 결국 우리가 찾은 해결책은 직접 산란이 아닌 간접 산란으로 처리하도록 특정 비율을 명시적으로 지정할 수 있는 '간접 요소'를 개발하는 것이었습니다.

총정리
이제 남은 것은 다양한 요소를 결합하여 최종 이미지를 구성하는 것입니다. 레이리, 미에, 높이 요소를 합치면 다양한 산란 색상의 멋진 구성을 만들 수 있습니다.

다음으로 오클루전 버퍼를 잘 활용해야 합니다. 직접, 간접, 클라우드 및 스카이 스캐터링에 적용되는 오클루전의 양을 조정하기 위해 다양한 강도 파라미터를 사용합니다.

마지막으로 남은 것은 렌더링된 이미지에 산란을 혼합하는 것뿐입니다. 총 누적 소멸량만큼 전송된 이미지를 어둡게 하고, 총 누적 산란량만큼 밝게 합니다. 이렇게 하면 예제 장면의 최종 구도가 완성됩니다.

에셋 스토어에서 다운로드할 수 있는 별도의 프로젝트로 대기 산란을 추출했습니다. 이 프로젝트에는 솔루션을 구성하는 모든 코드와 셰이더 외에도 이 게시물에서 이미지를 생성하는 데 사용된 모든 구성 프리셋도 포함되어 있습니다. 다양한 구성 옵션의 의미에 대한 자세한 내용은 포함된 사용 설명서를 확인하세요.
참조:
[1]: 대기 산란을 고려한 지구 표시
https://nishitalab.org/user/nis/cdrom/sig93_nis.pdf
[1]: 다중 산란을 고려한 스카이 컬러의 표시 방법
https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf
[1]: 다중 이방성 산란과 스카이 라이트를 고려한 클라우드 표시
https://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light
패키지의 HDR 하늘은 NoEmotionHDRs(피터 사니트라) / CC BY-ND 4.0에서가져온 것입니다. 수정하지 않고 사용합니다.
