Post Lists

2020년 1월 9일 목요일

Simulating the Colors of the Sky

https://www.scratchapixel.com/lessons/procedural-generation-virtual-worlds/simulating-sky

Keywords : simulating colors of the sky, atmospheric scattering, Rayleigh scaterring, Mie scattering, sky color, simulation of the sky, scattering coefficients, absorption coefficients, extinction coefficients, phase functions, optical depth, volume rendering, sunlight, single scattering, multiple scattering, atmosphere, daylight, sunlight

이 챕터에서, 우리는 atmospheric scattering에 대해서 배울 것ㅇ다. 우리는 너가 volume rendering과 subsurface scattering에 대한 강의를 또한 읽기를 추천한다. 그것들은 이 주제와 함께 거의 같은 개념들을 공유하다. 사실, atmospheric scattering은 volume rendering의 확장판으로서 볼 수 있다.

Introduction
몇 세기 동안, 하늘은 확실히 가능한 많이 정확하게 하늘의 색들을 묘사하려고 했던 많은 예술가들에게 매혹적인 주제였다. 19 ~ 20 세기 이전의 많은 세대의 물리학자들과 수학자들 또한 무엇이 하늘이 일몰과 일출때 오렌지색 처럼 보이게 하고, 낮 동안에는 파랗게 보이게 하는지를 알아내는데 몰입했었다. 역사적으로, atmospheric scattering의 발견은 Rayleigh의 공으로 돌려진다 (또한, John Strutt으로 알려져있다). 그의 주된 연구 과제가 19세기 말에 만들어졌던 노벨 상을 받은 영국 물리학자이다 (Rayleigh는 electromagnetism으로 유명한 Cambridge University에서 Maxwell을 계승했다. 컴퓨터 그래픽스 연구의 많은 부분은 Maxwell의 작업과 연관이 있다. Rayleigh는 또한 Max Planck와 함께 black bodies를 연구했다). Atmospheric scattering은 또한 한 오브젝트의 외관에 영향을 미친다. 이 효과는 aerial perspective라고 알려져있고, Leonardo Da Vinci에 의해 그의 그림들에서 처음으로 관찰되고 연구되고, 재현되었다 (사실, 이 기법은 Da Vinci의 작품 이전에 그림들에서 발견될 수 있다). 한 오브젝트와 관찰자 사이의 거리가 증가함에 따라, 그 오브젝트의 colors는 atmosphere의 색들로 대체되어진다 (하늘에 대해서, 낮 동안 그것은 보통 파랗고, 일몰과 일출 에는 red-orange이다). 이것은 중요한 단서인데, 우리 인간이 오브젝트들이 서로에 관련하여 얼마나 파랗게 보이는지를 비교하여 풍경에서 오브젝트들의 거리를 측정하는데 익숙하기 때문이다. (digital) 그림에서, aerial perspective는 크게 한 이미지에 depth를 더하는데 도움이 될 수 있다 (그 뇌는 좀 더 쉽게 다른 것보다 더 멀리 있는 것을 처리할 수 있다), 이것은 다빈치의 그림의 다음의 복제에서 보여진다 (Madonna of the Rocks).

좀 더 최근 역사에서, 즉 컴퓨터 그래픽스의 역사에서, Nishita는 "Display of the Earth Taking into account Atmospheric Scattering" 이라고 이름 붙여진 seminal paper를 1993에 작성했다. 거기에서, 그는 sky의 colors를 simulate하는 알고리즘을 설명한다. 흥미롭게도, 그의 논문 그리고 같은 주제인 1996년에 그가 작성한 다음의 것은 ("Display Method of the Sky Color Taking into Account Multiple Scattering") 전적으로 atmospheric simulation이 아닌, 우주에서 보여지는 지구에 대한 현실적인 렌더링에 (해양의 표면, 구름, 대륙의 렌더링을 포함하는) 대한 것이였다.
이것은 최근에, 컴퓨터 그래픽스 기술들의 발전이 제품들의 정확한 재연을 위한 제조 산업에 의해 주도되었거나 3D 가상 훈련 환경을 제공되었다는 것을 알려준다. 오락 산업이 (영화와 게임) 아닌 . sky를 재연하기 위해 Nishita에 의해 설명된 기법은 그의 시대 이후에 많이 변하지 않았다. 이 분야에서 된 대부분의 연구들은 그의 알고리즘을 GPU에서 simulation quality에서는 눈에 띌만한 개선 없이 구현하는 것에 중점을 두 었다 (중점은 속도와 실시간 재연 이였다). 또 다른 sky model은 1999년 Siggraph에서 출판된 한 논문 ("A Practical Analytic Model for Daylight")에서 Preetham & al.에 의해 설명된 것이 존재한다. 그것의 제목이 암시핟듯이, 이것은 sky colors의 정확한 재연을 제공하는 analytical model이다. 그러나, Nishita에 의해 제안된 기법보다 좀 더 제한적이다 (예를들어, 그 모델은 땅에서 위치한 관찰자에게만 유효하다). night sky의 재연에 대해 2011년에 Siggraph에서 Jensen & al.에 의해 출판된 한 논문을 ("A Physically-Based Nightsky Model") 언급할 가치는 있다. 이 챕터는 Nishita model의 구현만 제안할 것이다. 다음의 챕터들에서, 우리는 다른 알고리즘들을 연구할 것이다.

다음 문단에서, 우리는 함께 결합되면 sky의 colors에 책임이 있는 다양한 현상들을 설명할 것이다. 우리는 그러고나서 Nishita의 알고리즘이 이러한 현상들을 어떻게 재현할지를 보여줄 것이다. 우리는 C++ 프로그램으로 그 모델을 재현하고 나서, 우리가 aerial perspective를 재연하는 기법을 확장할 수 있다는 것을 보여줄 것이고, 모델의 파라미터들을 바꾸어서, 우리는 또한 alien skies를 만들 수 있다는 것을 보여줄 것이다.

Atmospheric Model
대기는 행성을 둘러싼 gas의 한 layer이다. 이 대기는 행성의 중력으로 인해 자리를 유지한다. 이 대기를 정의하는 것은 주로 그것의 thickness와 그것의 composition이다 (그 대기가 만들어지게 되는 다른 원소들). 지구 대기의 두꺼움은 약 100km이고 (Karman line에 의해 제한된), 산소, 질소, 아르곤 (Rayleigh에 의해 발견된), 이산화탄소, 물 증기로 구성된다. 그러나 시뮬레이션에서, 우리는 60km의 두꺼움을 사용할 것이다 (우리는 오직 지구의 대기에서 처음 두 개의 층들에서의 scattering인 troposphere(대류권)과 stratosphere(성층권)만을 고려할 것이다). 만약 너가 volume rendering에 대한 강의를 읽었다면 (우리는 만약 너가 아직 하지 않았다면 계속하기 전에, 그것을 지금 하기를 초대한다), 너는 photons이 particles과 충돌할 때, 흩뿌려진다는 것을 알 것이다. 빛이 어떤 방향으로 한 volume (대기)를 통해서 이동할 때, photons은 particles과 충돌할 때 다른 방향으로 굴절된다. 이 현상은 scattering이라고 불려진다. 빛이 particles에 의해 얼마나 자주 scattered되는지는 particles의 properties (주로 그것들의 크기)와 volume에서 그것들의 농도 (부피의 한 단위 안에 얼마나 많은 particles/molecules이 있는지)에 의존한다. 우리는 이제 지구 대기가 만들어진 molecules의 크기를 가지고 있고, 우리는 또한 그것들의 concentration/density를 안다. 우리는 우리의 atmospheric scattering simulation을 위해 이러한 과학적 측정치를 사용할 것이다. 행성을 둘러싸는 대기의 한 가지 좀 더 중요한 측면은, 이러한 입자들의 농도가 높이가 증가함에 따라 줄어든다는 것이다. 다시 말해서, 우리는 해수면에서 2km 위에서보다, 바로 해수면에서 공기의 unit cube당 더 많은 molecules를 발견한다는 것이다. 이것은 scattering의 양이 우리가 언급했듯이 molecules의 density에 의존하기 때문에 중요한 사실이다. 빛은 대기에서 upper layer에서 땅으로 이동하기 때문에, 우리는 regular intervals로 ray를 따라 atmosphere density를 sample할 필요가 있고, 이러한 sample positions에서 atmosphere density를 기반으로 scattering의 양을 연산할 것이다 (우리는 나중에 상세히 설명할 numerical integration을 수행한다). 대부분의 논문들은 (Nishita의 것을 포함하여) atmosphere density가 height와 함께 exponentially하게 감소한다고 한다. 다시 말해서, 간단한 식의 형태로 모델링 될 수 있다는 것이다:

여기에서 density(0)은 sea level에서의 air density이고, h는 현재 높이 (altitude) 인데, 그 곳에서 우리는 atmosphere density를 측정한다. 그리고 H는 대기의 농도가 균일한다면 atmosphere의 thickness이다 (과학 논문에서, H는 scale height라고 불려지고, 사실 대기의 농도가 e 씩 줄어드는 고도와 관련이 있다. H는 기온에 의존한다). 몇몇 논문들은 이 모델이 좋은 근사라고 주장하지만, 그러나 다른 이들은 그것이 부정확하다고 주장하고, sky density를 대기의 thickness와 density 각각에 의해 결정되는 동심원의 layers의 연속으로서 모델링하기를 선호한다.

[
sky densities를 일련의 layers라고 모델링하는 것은 (Nishita의 논문에서 spherical shell 이라고 불려지는) 또한 연산의 고나점에서 이점을 준다. 우리는 lights의 경로를 따라 viewer를 향해 numerical integration을 수행할 것이기 때문에, 밀도가 높은 대기의 지점에서 취해지는 샘플들은 밀도가 낮은 곳에서 취해진 샘플들보다 더 중요하다. ray를 따라서 "constant step"를 수행하는 것은 그러므로 좋지 않은 convergence를 만들어 낼 것이다. 요즘, 컴퓨터들은 매우 빨라서, 우리는 regular steps을 취하여 이 연산을 brute force할 수 있지만, Nishita의 시절에는, 그 알고리즘을 최적화하는 것이 필수적이였었다. 그러므로, 그는 그 대기가 spherical shells의 연속으로서 나타내어지고, 저 고도에서 작은 intervals로 고고도에서는 긴 intervals로 나눠지는 모델을 제안했었다. 그러나, 논문에서 출판된 그림에서, 그 layers들의 thickness는 매우 exponential variation을 가진 것처럼 보인다는 것에 주목해라. 이것은 매우 놀랍지 않은데, 각 sheel의 반지름이 정확히 air molcules의 density distribution에 의해 그의 모델에서 결정되기 때문이다 (그리고 그가 이 밀도를 연산하기 위해 사용한 공식은 우리가 위에서 적은것과 매우 유사하다).
]

대기는 작은 particels로 구성된다 (air molecules). 그리고 이것들은 또한 low altitude에서 aerosols이라고 불려지는 더 큰 particles들과 섞인다. 이러한 particles들은 바람에 의해 일어나는 먼지 또는 모래의 어떤 것이 될 수 있고, 공기 오염으로 인한 것이 될 수 있다. 그것들은 확실히 대기 외관에 영향을 주는데, 특히 그것들이 air molecules이 하는 방식과 같이 light를 scatter하지 않기 때문이다. air molecule에 의한 light의 scattering은 Rayleigh scattering이라고 불려지고, aerosols에 의한 light의 scattering은 Mie scattering이라고 불려진다. 요약해서, Rayleigh scattering (air molecules에 의한 light의 scattering)은 하늘의 blue color에 책임이 있다 (그리고 그것은 일출과 일몰에서 red-orange colors이다). 반면에 Mie scattering (aerosols에 의한 light의 scattering)은 보통 오염된 도시 위로 너가 보통 보는 white-grey haze에 책임이 있다 (haze는 하늘의 clarity를 애매하게 한다, 그림 2를 보아라).

그 모델은 다음을 언급하지 않고는 불완전할 것이다. 상요자가 행성과 하늘의 반지름을 명시하는 것이 요구될 것이라느 것이다. 이러한 숫자들은 view와 light rays를 따라 취해지는 sample positions의 altitude를 연산하기 위해 사용될 것이다. 지구에 대해, 우리는 Re = 6360km (e는 Earth), Ra = 6420km (a는 atmosphere) 를 사용할 것이다. 거리와 관련된 우리의 모델의 모든 거리와 파라미터들은 같은 단위 시스템에서 표현될 것이다 (km, m, 등).

[
atmospheric models에 대해, 이것은 까다로울 수 있는데, 행성들의 크기가 클 수 있기 때문이다. 그러한 크기에 대해, kilometer는 보통 좀 더 적절한 선택이다. 그러나 scattering coefficients는 매우 작고, 그래서 그것들은 좀 더 쉽게 meters 또는 millimeters의 단위로 표현된다 (심지어 light wavelengths에 대해서는 nanometers). 좋은 단위를 선택하는 것은 부동 소수점 정밀도 제한에 의해 된다 (즉 만약 그 숫자가 너무 크거나 너무 작다면, 이러한 숫자들의 컴퓨터에 의한 floating representation은 부정확해질 수 있고, 계산 에러를 만들 것이다). 그 모델에 대한 Input parameters는 다른 단위로 표현되어질 수 있고, 내부적으로 그 프로그램에 의해 변환되어질 것이다.
]

마지막으로, 우리는 우리의 모델의 설명을 다음을 하여 마무리할 것이다. 우리의 sky의 illumination의 main source는 태양이다. 그 태양은 지구에서 매우 멀어서, 우리는 대기에 닿는 모든 light rays가 서로에게 평행하다고 가정할 수 있다. 우리는 이 관찰이 어떻게 우리의 모델의 구현을 간단하게 하는지를 보여줄 것이다.

Rayleigh Scattering
air molecules에 의한 light의 scattering은 19세기 후반 Rayleigh에 의해 발견되었다. 그는 특히 이 현상이 강한 wavelength dependency를 가졌다고 보여줬고, 좀 더 정확하게는, air molecules이 green and red light보다 blue light를 좀 더 많이 scatter한다는 것을 보여주었다. 우리가 대기에서 찾는 것과 같은 molecules로 만들어진 volumes에 대한 scattering coefficients를 연산하기 위해 그가 생각해낸 scattering의 형태와 방정식은 오직 visible light를 구성하는 wavelengths보다 훨씬 더 작은 sizes를 가진 파티클에만 적용된다 (그 파티클은 적어도 scattered wavelength보다 10분의 1보다 더 작아야 한다). visible light의 Wavelengths는 380 ~ 780nm, 440, 550, 680이 blue, green, 그리고 red light에 개별적으로 최대치라고 고려되고 가변적이다. 우리는 이러한 값들을 이 강의의 나머지동안 쓸 것이다. 그 Rayleigh scattering equation은 한 volume에 대한 scattering coefficients를 제공하는데, 우리는 거기에서 그 molecular density를 알게 된다. atmospheric scattering에 대한 글에서, scattering coefficients는 그리수 문자 베타로 표기된다.

그 superscript S는 scattering에 해당하고, subscript R는 Rayleigh에 해당한다 (이러한 계수들을 Mie scattering coefficients와 구분하기 위해서이다). 이 방정식에서, h는 고도이고, lambda는 wavelength이고, N은 sea level에서의 molecular density이고, n은 air의 index of refraction이고, H_R은 scale height이다. 우리의 시뮬레이션에서, 우리는 H_R = 8km로 사용할 것이다 (필요하다면 좀 더 정확한 측정을 위해서 웹에서 scale height를 찾아라). 너가 이 방정식과함 께 볼 수 있듯이, 짧은 wavelength를 가진 (blue light 처럼) 빛은 beta에 대해 더 높은 값을 줄 것이다; 긴 wavelength (red)를 가진 빛보다. 그리고 이것은 하늘이 낮 동안 왜 파랗게 보이는지를 설명한다. 태양의 빛이 대기를 통과하여 지날 때, 좀 더 많은 blue light가 green and red light보다 관찰자들에게로 scattered 된다. 일출과 일몰에는 왜 red-orange로 보이는것인가? 그 특정한 환경에서, 태양으로부터의 빛이 관찰자의 위치에 도달하기 위해 대기의 더 긴 부분을 이동해야만 하는데, 태양이 너의 머리 위에 있을 때 (zenith) 보다 더 많이 움직여야 한다.그 거리는 상당히 길어서, 대부분의 blue light는 멀리 scattered 되는데, 이것은 observer의 위치에 도달하기 전에 그렇게 된다. 반면에 scattered 되지 않는 red light는 종종 blue light가 여전히 남아있는 것처럼 흩뿌려지지 않는다. 그러므로 일출과 일몰에서의 하늘의 red-orange (가끔식 보라색이거나 초로색일 수 있는)이 된다.

우리는 N, n 등에 대해 beta 값을 연산하기 위해 몇 가지 측정치를 쓸 수 있지만; 우리는 해수면에서 하늘의 scattering coefficients와 일치하는 미리 연산된 값을 사용할 것이다 (33.1e^-6m^-1, 13.5e^-6m^-1, 5.8e^-6m^-1 for wavelengths 440, 500 and 680 respectively). blue light에 대한 scattering coefficients가 green과 red light에 대한 계수보다 얼마나 더 큰지를 주목해라). 방정식의 exponential part를 적용하여, 우리는 어떤 주어진 고도 h에 대한 이러한 계수들을 조절할 수 있다.

[
Nishita의 논문들과 우리가 이 강의에서 언급한 다른 논문들이 가진 주된 문제들 중 하나는, 그것들이 N, n 등에 대해 논문에서 보여지는 이미지들을 생성하기 위해 사용될 값들을 주지 않는 다는 것이다. 측정치가 사용될 때, 논문의 저자들은 보통 그것들의 sources를 인용하지 않는다. sea levels에서의 molecular density에 대한 과학적 데이터를 찾는 것은 명백하지 않고, 만약 너가 유용한 링크 또는너가 우리에게 줄 수 있는 이 주제에 대한 정보가 있다면, 우리는 너가 말하는 것을 듣고 싶다. 우리가 이 강의에서 사용하는 sea level scattering coefficients는 두 개의 논문에서 발견될 수 있다 : "Efficient Rendering of Atmospheric Phenomena", by Riley et al. and "Precomputed Atmospheric Scattering" by Brunenton et al.
]

우리는 공기의 밀도에 대해 너무 깊게 들어가지 않을 것이지만, 흥미로운 정보는 이 문제에 대해 인터넷에서 발견되어질 수 있다. 이 강의에서, 우리가 정말 필요한 것은 하늘의 색을 재생성하기 위해 잘 작동하는 해수면에서의 평균 scattering coefficients이지만, 이러한 계수들을 연산하는 방법을 배우는 것은 atmospheric model에 대해 좀 더 많은 제어를 갖길 원하는 호기심 있는 독자들에게 흥미가 있을 것이다.

만약 너가 Volume Rendering에 대한 강의를 읽는다면, 너는 participating media를 렌더링하는데 사용되는 physical models 들이 scattering coefficients, absorption coefficients, 그리고 phase function 이라는 것을 알 것이다. 빛이 입자와 부딪힐 때 얼마나 많이 그리고 어떤 방향으로 흩뿌려지는 가를 설명한다. 이 강의에서 지금까지, 우리는 지구의 대기에 대한 scattering coefficinets에 대한 값 (그리고 어떻게 연산하는지를 설명했고)을 주었다. atmospheric scattering에 대해, absorption이 무시할만하다는 것이 보통 인정된다. 다시 말해서, 우리는 atmosphere가 light를 흡수하지 않는다는 것을 가정한다. Volume Rendering에서의 강의에서, participating media를 렌더링하기 위해 사용되는 physical model에서 우리가 필요한 extinction coefficient가 absorption과 scattering coefficients의 합이라는 것을 기억해라. 그러므로 (absorption coefficient가 zero이기 떄문에), 우리는 그 extinction coefficient 에 대해 다음으로 쓸 수 있다:


그 Rayleigh phase function은 이렇게 보인다:

여기에서 mu는 light와 view directions 사이의 각으 cosine 값이다 (그림 8 참조).

Mie Scattering
Mie scattering은 한 방식으로는 Rayleigh equation과 유사하지만, scattered wavelength보다 더 큰 크기를 가진 particles들에 적용된다. 이것은 우리가 지구의 대기의 낮은 고도에서 찾을 수 있는 aerosols의 경우이다. 만약 우리가 Rayleigh equation을 aerosols에 적용하려고 한다면, 우리는 납득할만한 이미지를 얻지 못할 것이다. scattering coefficients를 렌더링하는 Mie equation은 이것처럼 보인다:

여기에서 subscript M은 Mie에 해당한다. Mie scattering에 대해, 보통 1.2km로 설정되는 특정한 scale height value H_M이 있다는 것에 주목해라. Rayleigh scattering과는 대조적으로, 우리는 Mie scattering coefficients를 연산하는 방정식이 필요하지 않다. 우리는 대신에 해수면에서 측정된 값을 사용할 것이다. Mie scattering에 대해, 우리는

를 사용할 것이다. Aerosols은 또한 고도와 함께 exponentially하게 감소하는 밀도를 갖는다. Rayleigh scattering과 마찬가지로, 우리는 방정식의 우변에서 exponential term를 포함하여 이 효과를 재연할 것이다 (H_m scale height factor에 의해 조절되는). Mie extinction coefficient는 그것의 scattering coefficient 값의 1.1배이다. 그리고 Mie phase function equation은:

Mie phase function은 medium의 anisotropy를 제어하는 항 g (Rayleigh phase function은 가지지 않는)을 포함한다. Aerosols은 강한 forward directivity를 보여준다. 어떤 논문들은 g = 0.76를 사용한다 (그리고 우리는 이것을 우리의 default value로 사용할 것이다).

The Concept of Optical Depth
C++로 알고리즘의 실제 구현을 보기 전에, 우리는 모든 퍼즐 조각을 맞출 것이다. 첫 번째로, 우리는 하늘이 한 solid sphere를 둘러싸는 spherically shaped volume에 불과하는 것에 주목해야 한다. 그것은 한 volume 일 뿐이기 때문에, 우리는 participating medium를 렌더링하는데 가장 흔한 기법인 ray-marching algorithm을 사용할 수 있다. 우리는 Volume Rendering 강의에서 그 알고리즘을 상세히 연구했었다. 우리가 한 volume을 렌더링할 때, 그 관찰자 (또는 카메라) 는 volume 안 또는 밖에 있을 수 있다.

그 카메라가 안에 있을 때, 우리는 viewing ray가 그 volume을 나가는 지점을 찾을 필요가 있다. 밖에 있을 때, 우리는 viewing ray가 그 volume을 들어가고 나가는 지점들을 찾을 필요가 있다. 하늘은 sphere이기 때문에, 우리는 이러한 점들을 analytically하게 연산하기 위해서 ray-sphere intersection routine을 사용할 것이다. 우리는 basic section에서 (Ray-Quadratic Shapes Intersection) ray와 sphere의 교차를 연산하는 두 개의 기법들을 보여주었다. 우리는 ground를 reference로 상요하여 고도를 테스트하여 카메라가 밖에 있는지 안에 있는지를 안다. 만약 이 고도가 atmosphere thickness보다 더 크다면, 그러면 그 카메라는 대기 밖에 있고, viewing ray는 그 대기와 두 곳에서 교차할지도 모른다.

이제 우리는 그 카메라가 땅 위에 있다고 가정할 것이지만 (또는 땅 1미터 위에), 그 알고리즘은 어떠한 임의의 카메라 위치에도 작동할 것이다 (우리는 이 강의의 끝에서 outer space에서의 sky의 이미지를 렌더링할 것이다). 우리가 viewing ray (프레임에서 한 픽셀과 일치하는) 가졌다고 가정하자. 그리고 우리가 이 ray가 그 대기의 upper limit과 교차하는 곳이 어딘지를 안다고 가정하자. 우리가 이 지점에서 해결해야할 문제는, 그러한 빛이 viewer의 방향에서 이 ray를 따라 얼마나 많이 이동했는가 이다. 우리가 다음의 그림에서 볼 수 있듯이, 우리의 카메라 또는 관찰자는 직접적으로 태양을 바라볼 확률이 낮을 것이다. (그리고 이것은 너의 눈에 위험하다)/

모든 로직에서, 만약 너가 하늘의 방향으로 바라본다면, 너는 어떤 것도 보지 못할 건인데, 왜냐하면 너는 텅 비어있는 바깥 공간을 바라보고 있기 때문이다 (천체 사이의 공간). 그러나, 사실은 너는 blue color를 본다는 것이다. 이것은 태양에서 대기를 들어가고 air molecules에 의해 viewing direction에서 방향이 바뀌는 빛에 의해 발생한다. 다시 말해서, 태양으로 부터 와서 viewing direction을 따라 이동하는 직접적인 빛은 없지만 (만약 그 viewing direction이 그 태양을 직접적으로 가리키지 않는다면), 그 태양으로부터 오는 빛이 대기에 의해 scattered 되기 때문에, 그 빛 중 어떤 것은 너의 눈에 방향에서 이동하게 된다는 것이다. 이 현상은 single scattering이라고 불려진다 (그리고 이것은  Volume Rendering 강의에서 설명되었다).

우리는 이제까지 무엇을 알고있는가? 우리는 그 프레임에서 한 픽셀에 대해 sky color를 렌더링 하기 위해, 우리는 처음에 점 Pc (camera position) 으로부터 흥미가 있는 방향으로 viewing ray (V)를 던질 것이다. 우리는 점 Pa를 계산할 것인데, 이것은 ray가 대기와 교차하는 지점이다. 마지막으로, 우리는 이 ray를 따라, single scattering에 의해 이동하는 빛의 양을 연산할 필요가 있다. 이 값은 Volume Rendering에서 우리가 공부했던 volume rendering equation으로 연산될 수 있다:


여기에서 T는 점 PcX (viewing direction을 따라 있는 sample position) 사이의 transmittance이고, LX에서의 volume에서 빛의 양이다. 그것이 말하는 것은, Pc에서 관찰자에게 도달하는 빛의 전체 양은 viewing direction V를 따라 scattered되고 있는 모든 sunlight와 동일하다는 것이다. 이 양은 V를 따라 다양한 positions(X)에서 light를 합하여 얻어질 수 있다. 이 기법은 numerical integration이라고 불려진다. 우리가 ray를 따라 더 많은 samples들을 취할 수록, 그 결과는 더 좋지만, 연산하기에 더 오래 걸린다. 방정식에서 transmittance term (T)는 각 sample position(X)에서 viewer의 방향에 있는 V를 따라 scattered된 빛이 또한 그것이 X에서 Pc로 이동함에 따라 감쇠된다는 것을 설명한다.

volume rendering의 강의에서, light는 volume에서 한 지점에서 다른 곳으로 이동함에 따라 absorption과 out-scattering으로 인해 감쇠된다는 것을 상기해라. 우리가 Pb, 가진 빛의 양을 Lb라고 부르고, Pb로부터 Pa에 도달하는 빛의 양을 La라고 부르자. participating medium의 존재에서, La (Pb로부터 받아진 light) 는 Lb보다 더 낮을 것이다. Transmittance는 Lb 에 대한 La의 비율을 나타낸다. 그러므로, T는 0에서 1의 범위에 있게 된다. 방정식의 형태에서, transmittance는 이것처럼 보인다:

쉬운 영어로, 이 방정식은, 우리가 path ray Pa-Pb를 따라서 다양한 sample positions에서 atmosphere의 extinction coefficients B_e를 측정할 필요가 있고, 이러한 값들을 합하고, 그것들을 length segment ds로 곱하고 (즉, 사용된 samples의 개수에 의해 나눠진 Pa-Pb의 거리), 이 값의 음수를 취하고, 그것을 exponential 함수에 주는 것을 의미한다.

Rayleigh scattering에 대해 우리가 말한 것으로 다시 돌아가서, 너는 B_s (우리가 B_e를 연산한) 가 scale height (H)에 대해 altitude h의 exponential로 조절되어 해수면에서 scattering coefficients를 사용하여 연산될 수 있다는 것을 기억할 것이다.

Rayleigh scattering에 대해, absorption은 무시될 수 있고, 우리는 다음과 같이 쓸 수 있다:


너는 적분에서 (상수이기 때문에) B_e(0)을 없앨 수 있고, 그 transmittance equation을 다시 쓸 수 있다:


exponential function안에 있는 sum은 P_a와 P_b 사이의 평균 density value로서 보아질 수 있고, 방정식 자체는 보통 점 Pa-Pb사이에 있는 대기에서의 optical depth로서 교재에서 언급된다.

Adding the Sunlight
마지막으로, 우리는 이전 단락에서 sky color를 연산하기 위해 보여주었던 렌더링 방정식을 사용할 것이다. 그것을 다시 써보자:

우리는 그 transmittance를 어떻게 렌더링할지를 설명했었다. 이제는 L_sun(X) 항을 봐보고, 그것을 어떻게 얻는지를 설명해보자. L_sun(X)는 viewing direction을 따라 sample position X에 scattered된 sunlight의 양과 일치한다. 그것을 얻기 위해, 처음에, 우리는 X에 도달하는 빛의 양을 연산할 필요가 있다. sunlight intensity를 직접적으로 취하는 것은 충분하지 않다. 실제로, 만약 light가 P_s에 있는 대기에 들어간다면, 그것은 또한 그것이 X로 이동할 때 감쇠된다. 그러므로, 우리는 viewing ray P_a에서 P_c를 따라 이동하는 빛의 감쇠를 연산하기 위해 우리가 사용했던 것과 유사한 방정식을 사용하여 이 감쇠를 연산할 필요가 있다:


Equation 1
viewing ray를 따라 각 샘플 position X에 대해, 기술적으로, 우리는 sunlight direction (L)로 한 ray를 던질 필요가 있고, 이 light ray가 대기 (P_s)와 어디에서 교차하는지를 찾을 필요가 있다. 그러고나서 우리는 방정식 1에서 transmittance (or optical depth)를 얻기 위해 viewing ray에 대해 우리가 사용했던 같은 numerical integration 기법을 사용할 것이다. 그 light ray는 segments로 나눠질 것이고, 각 light segment의 중심에서의 대기의 density가 얻어질 것이다.
sky color를 연산하는 알고리즘을 구성하는데 있어서 마지막으로 해야할 것중 하나는 light direction 그 자체와 view direction을 기반으로, viewing direction에 scattered된 light의 양을 설명하는 것이다. 이것은 phase function의 역할이다. Rayleigh와 Mie scattering은 우리가 주었던 그것들 자신의 phase function을 가지고 있다. 만약 너가 그 phase function이 무엇인지에 대한 refresher가 필요하다면, Volume Rendering에 대한 강의를 읽어라. 짧게 해서, 그 phase function은 방향 L로부터 들어오는 빛이 direction V에서 얼마나 많이 들어오는지를 설명하는 함수이다. 그 Mie phase function은 추가 항인 g를 포함하는데, 이것은 mean cosine이라고 불려진다 (많은 다른 가능한 이름 중에서), 이것은 그 빛이 주로 forward direction(L) 또는 backward direction(-L)를 따라 scattered되는지를 정의한다. forward scattering에 대해, g는 [0:1]의 범위에 있고, backward scattering에 대해, g는 [-1:0]의 범위에 있다. g가 0과 같을 때, light는 동일하게 모든 방향에 scattered 되어지고, 우리는 그 scattering이 isotropic하다고 말한다. Mie scattering에 대해, 우리는 g를 0.76으로 설정할 것이다.

마침내, 우리는 예를들어 Rayleigh scattering에 대해 주로 blue light가 view direction를 따라 scattered 되는 사실을 설명할 필요가 있다. 이것을 반영하기 위해, 우리는 방정식의 light part에 대해 완전한 방정식을 주는 scattering coefficients (\beta_s)로 이전 방정식의 결과를 곱할 것이다. 그러나, \beta_s가 고도에 따라 변한다는 것을 상기하자 (그것의 값은 고도에 대한 함수이다), 여기에서 h는 ground를 기준으로 (좀 더 정확히는 해수면) X의 높이이다:

지구의 대기에 대해, 태양은 하늘에서 유일한 light source이다. 그러나 이전 방정식의 generic form을 쓰기 위해서, 우리는 light가 많은 방향에서 들어올지도 모른다는 사실을 설명해야만 한다. 과학 논문에서, 너는 이 방정식이 4pi에 대한 적분으로서 쓰여진 것을 볼 것이다: 이것은 들어오는 방향의 한 sphere를 설명한다. 이 좀 더 generic equation은 또한 우리가 이 챕터에서 무시할 ground에 반사된 sunlight (multiple scattering)을 설명할 것이다.

Computing the Sky Color
모든 항들을 합쳐서, 우리는 다음을 얻는다 (equation 2):


Equation 2
(equation 3)과 함께:


Equation 3
만약 우리가 2에 있는 것을 3으로 바꾼다면, 우리는 다음을 얻는다:


그 phase function의 결과는 상수이고, sunlight intensity도 그렇다. 우리는 그러므로, 이러한 두 개의 항들을 적분의 바깥으로 옮길 수 있다 (equation 4):


Equation 4
이것은 특별한 view와 light direction에 대해 sky의 컬러를 렌더링하기 위한 최종 방정식이다. 그것은 그렇게 복잡하지 않다. 좀 더 연산적으로 까다로운데, 우리가 적분을 연산하고, exponential function에 대해 많은 호출을 하기 때문이다 (transmittance term을 통해). 게다가, 너는 그 sky color가 실제로 Rayleigh and Mie scattering의 결과라는 것을 기억할 필요가 있다. 그러므로 우리는 scattering의 각 유형에 대해 이 방정식을 두 번 연산할 필요가 있다:


미적분에서, 두 exponential functions의 곱이  인자가 처음 두 개 functions의 인자들의 합인 한 exponential function과 같다는 것을 기억해라:

우리는 이 특성을 이용할 수 있고 (우리는 두 번 대신에 한 번의 exponential를 연산한다) 그리고, 방정식 4에서 그 두 개의 transmittance terms의 곱을 다시 쓸 수 있다:




Equation 5
이제, C++ program에서 atmospheric model의 구현을 봐보자.