-
[UE4] A Scalable and Production Ready Sky and Atmosphere Rendering Technique 리뷰 (1/2)Graphics/Graphics Study 자료 2023. 3. 7. 23:32
[UE4] A Scalable and Production Ready Sky and Atmosphere Rendering Technique 리뷰 (1/2)
최초 작성 : 2023-03-07
마지막 수정 : 2023-03-07
최재호목차
1. 목표
2. 내용
2.1. Single scattering 기반 대기 산란 식
2.1.1. Transmittance function
2.1.2. Shadowing function
2.1.3. Single scattering function
2.1.4. luminance function
2.2. 행성의 특징
2.3. 지구와 같은 행성을 렌더링 하기 위해 필요한 컴포넌트
2.4. 대기 산란을 관찰했을 때 우리가 확인할 수 있는 부분
2.5. 실제 렌더링을 위해 사용되는 4개의 LUT
2.5.1. Transmittance LUT
2.5.2. Sky-View LUT
2.5.3. Aerial Perspective LUT
2.5.4. Multiple scattering LUT
2.5.4.1. 이전 대기 렌더링 기술의 특징과 새로운 방식의 목표
2.5.4.2. Multiple scattering 의 특징
2.5.4.3. Multiple scattering 식 유도 및 LUT 생성
2.6. 최종적으로 얻어진 Multiple scattering 식
3. 레퍼런스
1. 목표
UE4에 사용하는 대기 산란 알고리즘의 기반이 되는 논문 A Scalable and Production Ready Sky and Atmosphere Rendering Technique, Sébastien Hillaire (레퍼런스1) 를 이해하고 실제 구현코드를 분석해 봅시다.
이 글은 총 2개로 구성됩니다.- 이번 글에서는 논문의 내용을 요약하고 이론에 대해서 알아봅니다.
- 다음글에서는 저자가 제공하는 구현코드 https://github.com/sebh/UnrealEngineSkyAtmosphere 를 보면서 논문에서는 명세되지 않은 세부사항 들을 코드레벨로 확인해 봅니다.
이 글을 읽기 전에 다음 글을 먼저 읽어보면 내용을 이해하는데 도움이 됩니다.
이 논문에는 radiance 를 luminance, Irradiance 를 illuminance 로 표기하고 있기 때문에 동일하게 설명하겠습니다.
그리고 혹시 보시다가 틀린점이 발견되면 지적해주시면 감사하겠습니다.
2. 내용
A Scalable and Production Ready Sky and Atmosphere Rendering Technique, Sébastien Hillaire (레퍼런스1) 에서 목표하고 있는 것은 다음과 같습니다.
- 리얼타임에 라이트의 Multiple scattering 을 평가하기 위한 새로운 근사를 제안.
- 대기 속성들을 동적으로 갱신할 수 있고(Dynamic time of day 지원). 아이폰 6s 부터 하이엔드 PC 에도 적용할 수 있도록 효율적으로 렌더링 가능해야 함.
Multiple scattering 가 어떤 것인지 알기 전에 기존 Single scattering 방식에 대해서 알아보고 두 가지가 어떤 차이가 있는지 알아봅시다. Single scattering 의 의미는 태양에서부터 특정위치에 도달하는 빛이 대기 내에서 단 한번 산란한 후 도착하는 것을 의미합니다. Single scattering 식을 보면서 어떻게 근사되는지 확인해 봅시다.
다음으로 진행하기 전에 Absorbption, in-scattering, out-scattering 에 익숙하지 않으시다면, 꼭 레퍼런스2 에서 해당 내용을 확인해 보시길 추천드립니다.
2.1. Single scattering 기반 대기 산란 식
그림1의 식에 나오는 항목들의 설명은 다음과 같습니다.
- c : 카메라의 위치
- v : 현재 위치에서 카메라로의 방향
- p : 표면과 충돌한 지점의 위치
- t_atmo : 현재 위치에서 라이트 방향으로 레이를 쐈을때 대기의 최상단까지의 거리
- L0 : p 에서의 luminance. (즉, 가상 행성의 지면에서의 라이팅)
- li : i 번째 라이트 방향
- Ei : i 번째 라이트의 illuminance
- σa : absorption(흡수되는 luminance 비율)
- σs : scattering(out-scattering 되는 luminance 비율)
- σt = σa + σs : extinction (absorption 와 out-scattering 으로 잃어버리는 에너지의 총 비율)
- Phase function p : 라이트의 방향과 카메라의 방향을 기반으로 카메라 방향이 있을 때, 카메라 방향으로 산란이 일어나는 비율
이제 그림1의 식을 하나씩 뜯어봅시다.2.1.1. Transmittance function
T(Xa, Xb) 함수부터 확인해 봅시다. T 함수는 구간 Xa ~ Xb 사이를 이동하면서 extinction 으로 잃어버리고 남은 luminance 의 비율을 나타냅니다. 식 내부에 extinction 계수 σt 는 Optical Depth 입니다. 이것은 경로 이동 중에 luminance 를 얼마나 감소하게 될지를 나타냅니다. 대기는 고도가 낮을수록 밀도가 높고 고도가 높을수록 밀도가 낮습니다. 그래서 σt(x) 형태로 현재 위치를 기반하여 extinction 정보를 얻어오는 것을 볼 수 있을 것입니다.
2.1.2. Shadowing function
다음으로 S(x, li) 함수를 확인해 봅시다. 여기서 x 는 현재위치, li 는 라이트의 방향입니다. S 식의 Vis(li)는 i 번째 라이트의 Visibility 여부를 나타냅니다. 만약 Visibility 값이 1이라면, T 를 추가로 평가해야 합니다. T(x, x + t_atmo * li)는 태양으로 부터온 라이트가 대기를 지나 x 로 이동했을 때 남아있는 비율을 나타냅니다.
2.1.3. Single scattering function
계속해서 Lscat(c, x, v) 함수를 봅시다. 여기서 c 는 카메라의 위치, x 는 현재위치, v 는 현재위치에서 카메라위치로의 방향벡터입니다. 이 식은 앞에 구한 T와 S 식 그리고 Phase function, σs, Ei 를 사용합니다. Phase function 의 경우 라이트가 진행하는 방향과 카메라의 방향을 기준으로 얼마만큼의 비율이 카메라의 방향으로 스케터링 되는지에 대한 정보입니다. σs 는 위에서 설명했듯 out-scattering 되는 라이트의 비율입니다. Ei 는 i 번째 라이트의 illuminance 입니다. S 에서는 라이트의 감소 비율만 계산했기 때문에 초기 라이트의 값이 필요합니다. 그래서 E 를 여기서 곱해줍니다. 그러면 이 식에서 우리가 모르는 내용은 없네요. 식을 다시 한번 봅시다.
Lscat 의 시그마 부분의 식을 먼저 봅시다. 모든 라이트에 대해 T * S * p * E 를 곱한뒤 더하는 것을 볼 수 있습니다. S * E 식은 태양에서 나온 라이트가 대기상단에서 현재위치까지 이동한 뒤 남은 라이트를 알 수 있습니다. 그림5 의 빨간색 선을 확인해 보세요. 다음으로 현재위치 x 에서 잔여 라이트의 양에 Phase function p 를 곱하여 카메라가 있는 방향으로 scattering 되는 라이트의 양을 계산합니다. 그리고 T 를 곱해주는데, T(c, x) 으로 현재위치 x 에서 카메라 위치 c 로 이동한 뒤 남은 라이트를 계산합니다. 그림5 의 초록색 선을 확인해보세요. 마지막으로 앞서 구한 결과에 σs 를 곱해줍니다. 현재위치에서 카메라 방향으로 향하는 라이트의 양은 현재 위치에서 out-scattering 되는 라이트의 양 중에서 Phase function 을 통해서 카메라 방향으로만 가는 라이트의 양을 얻어야 합니다. Phase function 은 이미 시그마내에서 곱해줬고, σs 는 공통으로 사용할 수 있는 변수이므로 식에서 빠져나온 것을 볼 수 있습니다.
이 식은 한 번의 Scattering 으로 부터 얻어진 luminance 입니다. 그래서 Lscat은 Single scattering 식이 됩니다. 레퍼런스1에서는 이 식을 개선하여 Multiple scattering 을 적용합니다.
2.1.4. luminance function
위의 Lscat 의 경우 카메라의 위치 c와 쉐이딩 포인트 p 사이에 있는 임의의 위치 x 한 곳에 대한 Single scattering 을 정의합니다. 그런데 실제로 c 와 p 사에는 수많은 구간이 있고 그 구간의 모든 지점에서 Single scattering 이 일어날 수 있을 것입니다. 그림6 의 빨간선을 봐주세요.
이 부분을 고려한 식이 바로 아래의 식입니다. 이 식은 카메라의 위치 c 와 쉐이딩 포인트 p 사이의 모든 Single scattering 을 더합니다. 그리고 쉐이딩 포인트 p 에서 카메라 방향 c 로 반사되는 라이트를 L0 로 둡니다. 그리고 여기에 T(c, p) 를 곱하여 c와 p 를 사이를 이동후 남은 L0 의 양을 구하여 이전에 구한 식에 더합니다.
정리하면, 쉐이딩 포인트 p 에서 부터 카메라 위치 c로 들어온 라이트와 p 에서 c 로 이동 중 발생한 Single scattering 라이트를 모두 합산한 값이 L 입니다. L은 실제 c 위치에서 관찰할 수 있는 라이트 (luminance) 입니다.지금까지 이 글에서 가장 중요한 식을 봤습니다. 이제 대기 모델에 필요한 세부사항에 대해서 조금 더 확인해 봅시다.
2.2. 행성의 특징
- 행성의 지면은 Uniform albedo ρ = 0.3 인 순수한 diffuse 머터리얼로 가정합니다.
- 지구의 경우 그림8 과 같이 나타낼 수 있습니다. 지구의 중심을 기준으로 지면은 6360km, 대기가 존재하는 최고 높은 고도는 6460km 입니다. 즉, 대기 레이어는 100km 정도입니다.
2.3. 지구와 같은 행성을 렌더링 하기 위해 필요한 컴포넌트
- Rayleigh : 라이트와 공기분자(air moecules) 의 상호작용을 나타냅니다.
- 라이트는 흡수되지 않고 주변으로 스캐터링만 된다고 가정합니다.
- 고도에 따른 밀도분포(density distribution) 은 (d^r)(h) = e^(-h/8km) 입니다.
- Phase function 은 다음과 습니다. 여기서 θ 는 라이트의 입력방향과 스케터링 돼서 나가는 방향 사이의 각임.
- Mie : 라이트와 Reyleigh 에 비해 상대적으로 큰 먼지와 같은 에어로졸(aerosols) 의 상호작용을 나타냅니다.
- 라이트는 흡수되거나 산란될 수 있습니다.
- 고도에 따른 밀도분포(density distribution) 은 (d^m)(h) = e^(-h/1.2km) 입니다.
- Phase function은 Cornette-Shanks phase function 을 근사하여 사용합니다.
- g 는 -1~1 범위고, 이것은 forward 와 backward scattering 의 상대 강도를 나타냅니다.
- Henyey-Greenstein phase function 도 사용할 수 있습니다. 이 함수에 대한 설명은 레퍼런스4 에서도 다루고 있습니다.
- Ozone : 지구에만 있는 특수한 부분입니다. 태양이 지평선에 있을 때 Sky-blue 색상을 얻게 해 줍니다.
- 라이트를 흡수하기만 합니다.
- 고도에 따른 밀도분포(density distribution)는 가로 30km 이고, 중심에서 고도가 25km 인 tent function 를 사용합니다. 그림11 를 참고해 주세요. 식 (d^o)(h) = max(0, 1 - |h-25|/15)
위의 세 가지 컴포넌트들의 scattering 과 absorption 을 그림12에서 볼 수 있습니다.
2.4. 대기 산란을 관찰했을 때 우리가 확인할 수 있는 부분
- Rayleigh scattering 이 부드럽습니다. 그림12 를 보면 Reyleigh 의 경우 파란색을 많이 스케터링 하는 것을 볼 수 있습니다. 그림13 의 하늘이 파란색으로 나오는 것은 Reyleigh 의 영향을 많이 받는데 하늘의 파란색이 부드럽게 잘 빠지는 것을 볼 수 있습니다.
- Mie scattering 으로 발생하는 태양 주변의 halo 효과가 꽤 부드럽습니다.
- 그림13 의 아래쪽 좌측이 Multiple scattering 적용전이고, 우측이 적용 후입니다.
- High frequency(급격한 변화) 는 지평선 방향에서 확인할 수 있습니다. 왜냐하면 대기의 밀도가 지면과 가까울수록 빠르게 증가하기 때문에 scattering 이 더 많이 일어나기 때문입니다.
- 행성의 산과 같은 지면이 만들어내는 그림자들이 High frequency 를 만들어냅니다. 왜냐하면 Single scattering 이벤트를 차폐시키기 때문입니다.
2.5. 실제 렌더링을 위해 사용되는 4개의 LUT
- Transmittance LUT
- Sky-View LUT
- Aerial Perspective LUT
- Multiple Scattering LUT
2.5.1. Transmittance LUT
Transmittance LUT 는 그림2 에서 봤던 T 함수를 캐싱해 둔 LUT 입니다. T 를 계산하기 위해서 적분을 계산해야 되는데, 런타임에 적분하는 것은 성능에 좋지 않으니 이 부분을 가속하는 데 사용합니다.
- LUT 입력값 : uv.x : 대기 내에서의 높이 (0은 Bottom, 1은 Top), uv.y : CosZenithAngle (ZenithAngle 그림14 참고)
- LUT 출력값 : Extinction(Absorb + out-scattering) 뒤 남아있는 luminance 비율
2.5.2. Sky-View LUT
Sky-View LUT 는 렌더링 중간에 다른 물체에 걸리는 것 없이 SkyBox or SkySphere 를 렌더링 할 때 사용하는 LUT 입니다. 이 식은 그림1 의 L 식으로 luminance 입니다.
- LUT 입력값 : uv.x : 위도, uv.y : 경도
- LUT 출력값 : Sky 를 렌더링할 때 사용되는 luminance(L) 값.
대기 구성에 참여하는 매체가 Low frequency 인 것을 생각하면, 레이마칭을 적은 숫자로 해도 충분할 것입니다. 그래서 더 낮은 해상도에서 Sky 를 렌더링 한 뒤 더 높은 해상도로 업스케일 하는 형태로 그립니다. 그림16 를 보면 지평선에 가까울수록 High frequency 를 띄는 모습을 볼 수 있습니다. 그래서 uv.y 를 non-linear 방식으로 사용하여 지평선에 가까울수록 더 많은 픽셀을 사용하도록 합니다. 아래 그림15와 그림17 을 참고해 주세요.
2.5.3. Aerial Perspective LUT
이 LUT 는 SkyBox 가 아닌 오브젝트를 렌더링 할 때 사용하는 LUT 입니다. 장면에 있는 오브젝트는 카메라와 떨어진 거리가 얼마나 될지 모르기 때문에 Depth 를 기준으로 LUT 텍스쳐를 3D Texture 에 저장합니다. 기본 해상도는 32x32x32 입니다. Depth 가 32인데, 32 km 라는 의미입니다. (레퍼런스1에서는 포트나이트에서는 월드맵이 3km^2 이라 충분했다고 하네요). 실제 오브젝트가 렌더링되는 경우 거리를 기반으로 적절한 Depth 를 인덱싱하여 사용할 것입니다. 그림18 을 봐주세요.
- LUT 입력값 : 카메라 뷰 기준 Screen uv 값, 거리기반 Slice index
- LUT 출력값 : luminance(L) 값, Transmittance 값
2.5.4. Multiple scattering LUT
마지막으로 우리가 리뷰 중인 논문(레퍼런스1)의 핵심인 Multiple scattering LUT 입니다. 세부사항을 알아보기 전에 Multiple scattering 에 대해서 조금 더 알아보고 식을 어떻게 구성하는지도 확인해 봅시다.
- LUT 입력값 : uv.x 태양의 CosZenithAngle, uv.y 대기 내에서의 높이(0이 Bottom, 1 이 Top)
- LUT 출력값 : 현재 지점에서의 Multiple scattering 결과 (이 결과에 illuminance E 를 곱하여 실제 luminance 를 얻을 수 있음)
2.5.4.1. 이전 대기 렌더링 기술의 특징과 새로운 방식의 목표
레퍼런스1에서는 이전 대기 렌더링 기술은 다음과 같은 특징이 있다고 합니다.
- Multiple scattering 의 구현은 3D or 4D LUT 를 반복적으로 업데이트하며, 1번의 반복당 order 1 라고 부릅니다.
- 지구와 같은 대기에서는 Multiple scattering order 5 로도 괜찮지만, 더 두꺼운 대기에 적용하는 경우 더 많이 LUT 를 업데이트해야 되기 때문에 사용이 어려울 수 있습니다. (O(n) 의 연산복잡도, n 은 scattering order). 시분할로 처리할 수도 있겠지만 딜레이가 되기 때문에 실시간 GI 나 Reflection cube map 캡쳐에 영향을 줄 수 있습니다.
레퍼런스1에서 이 Multiple scattering LUT 를 개선 목표는 다음과 같습니다.
- Scattering order 와 무관하게 O(1) 에 완료하여 Multiple scattering 기여를 지연 없이 평가합니다. 그래서 모바일부터 하이엔드 디바이스까지 적용하는 것입니다.
2.5.4.2. Multiple scattering 의 특징
Multiple scattering 의 특징은 다음과 같습니다.
- 특정 한 점에 도달하는 illuminance E 의 값은 그 점의 주변에서도 동일합니다. 대기 렌더링의 경우 다루는 범위가 상당히 넓기 때문에 해당 지점 주변의 E 가 거의 차이가 없다고 볼 수 있을 것입니다.
- 현재 위치의 주변으로 더 높은 차수(order) 의 scattering 이벤트는 현재 위치를 둘러싸고 있는 Sphere 에 대한 Single scattering 의 적분으로 근사할 수 있습니다. 이때 이웃점들은 동일한 illuminance E 를 받고 있을 것이고 이것을 사용하여 Single scattering 이 일어날 것입니다. 이웃점들 간 이동 시에 Transmittance 또한 고려합니다.
- Scattering order 가 2보다 같거나 크면, Scattering 방식이 isotropic phase function 가 됩니다. 그래서 Mie, Rayleigh phase function 은 Multiple scattering 에서 무시합니다.
- 현재 위치의 이웃 점들은 모두 동일한 양의 2 order scattering 을 가집니다.
2.5.4.3. Multiple scattering 식 유도 및 LUT 생성
- 이전 내용을 기반으로 2개의 함수를 정의합니다. 2 order scattering 기여를 나타내는 L_2ndOrder 와 f_ms 입니다.
- L_2ndOrder 에 대해서 먼저 알아봅시다. 이 식은 이웃지점에서 현재 방향으로의 Single scattering L 의 총합니다. 이때 이웃지점은 주변 Sphere 방향 전체를 말합니다. 그림19 의 왼쪽을 봐주세요. 그리고 L_2ndOrder 식은 그림20 을 봐주세요. Single scattering 을 구표면적에 대해서 적분하는 식을 확인할 수 있습니다. 그리고 그림20 의 식에서 Ei 는 1로 설정하여 Transfer function 과 같이 동작하도록 합니다. Transfer function 은 나중에 디렉셔널 라이트의 illuminance 를 곱하게 되면 실제 픽셀에 기여하는 luminance 값을 얻을 수 있는 함수입니다. 그림24 식을 보면 추후에 디렉셔널 라이트의 illuminance 를 곱해줍니다.
- f_ms 에 대해서 이야기해봅시다. 이식은 L_2ndOrder 에서 S(x, ws)와 Phase function pu가 빠진 것입니다.
- S(x, ws) 와 pu 는 L_2ndOrder 에서 적용되었기 제거됩니다. 그림21의 식을 확인해 주세요.
- 마지막으로 그림19 의 우측을 보면 f_ms 또한 구표면적에 대해서 적분하는 것을 확인할 수 있습니다.
- f_ms 는 Sphere 전체 방향에서 현재 지점으로 scattering 이 1회 일어나는 것을 의미합니다. 이것이 무한번 일어나서 계속 누적된다면, 무한등비급수를 통해서 표현할 수 있을 것입니다. 그리고 그 결과를 F_ms 로 둡니다.
- 최종 Multiple scattering 기여는 Ψ_ms (프사이라고 읽음) 이며, 위에서 구한 L_2ndOrder * F_ms 입니다.
이렇게 구해진 Ψ_ms 가 LUT 에 저장됩니다.
2.6. 최종적으로 얻어진 Multiple scattering 식
이렇게 만들어진 Ψ_ms 가 Single scattering 식을 Multiple scattering 식으로 어떻게 바꾸는지 확인해 봅시다. 그림24와 같이 Single scattering 식에 Multiple scattering 더해줍니다.
다음 글에서는 실제 코드 구현을 리뷰해볼 것입니다. 코드에서는 논문에서는 언급하지 않은 좋은 아이디어들이 많았습니다. 이 부분을 리뷰해 보는 것도 의미 있는 것 같아서 다음글에 다뤄보겠습니다.
3. 레퍼런스
1. A Scalable and Production Ready Sky and Atmosphere Rendering Technique, Sébastien Hillaire
2. Absorption and Scattering (흡수와 산란)
3. Accurate atmospheric scattering
4. Atmospheric Shadowing
'Graphics > Graphics Study 자료' 카테고리의 다른 글
RayTraced Ambient Occlusion(RTAO) (0) 2024.01.31 [UE4] A Scalable and Production Ready Sky and Atmosphere Rendering Technique 리뷰 - 코드분석 (2/2) (0) 2023.03.09 [UE4 PBR] Split sum appoximation 리뷰 (2) 2022.07.07 Dual-depth relief interior mapping (0) 2022.06.11 Weighted Blended OIT (0) 2022.05.23