테드옹의 VFX
Volume Shader Demystifying 본문
다음 차례는 Surface Shader
일단 당장하는 작업이 Volume이니까 이것 먼저.. ㅎㅎ
시작하기에 앞서, 볼륨 렌더링에 관한 정말 좋은 포스팅이 있으니 참고 :
Volume Rendering
Scratchapixel is used by 400,000 people yearly, yet no company supports us, not even with free software licenses. There's a global demand for accessible, high-quality education, and if these profitable companies refuse to help, we'll show them they're wron
www.scratchapixel.com
빛이 볼륨을 통과할 때는 크게 3가지 물리적 현상이 일어난다
1. Absorption (흡수) :
광원이 볼륨을 지나 우리의 눈에 들어올 때는 일부가 흡수되어 없어진다. 0의 수치를 모든 빛이 다 흡수되었을 때라 생각하면 1의 값은 진공에서 모든 빛이 투과했을 때이다. 흡수되는 양은 물성에 의하여 결정되는데 이것을 비어-람베르트 법칙에 의해 수식으로 표현될 수 있다.
비어 법칙의 골자는 볼륨의 density를 Absorption계수로 계산하는 것이다. 쉽게 말해 density가 높을수록 Absorption 계수가 증가하고, 따라서 볼륨이 두껍고 불투명하게 보인다는 것. 또한, 빛이 볼륨내에서 이동한 거리의 제곱의 상관관계 또한 존재한다.
흡수된 빛은 열에너지 같은 형태로 전환되어 계에서 완전히 삭제된다.
2. Scattering (산란) :
광원이 볼륨을 지나면서 흡수되지 않고 여러 방향으로 산란시키는 현상이다. 여러방향으로 산란하고 나면 우리의 눈으로 들어오는 빛의 세기는 약해졌을테니 다소 어둡게 보일 수도 있다.
[ Isotropy, Anisotropy ]
모든 방향으로 일정하게 빛을 산란하는 것을 isotropy(등방성)라고 하며 그러지 않는 것을 anisotropy(비등방성)이라고 한다.
보통 Forward Scatter라고 일컫는 현상은 광원의 방향대로 빛이 산란되는 현상을 말하며, 빛이 볼륨 내부를 뚫고 지나며 부드러운 그라디언트와 가장자리가 Backlit되는 현상을 더 부각시킬 수 있다
반대로 Backward Scatter라고 일컫는 현상은 광원의 반대방향으로 빛이 산란되는 현상을 말하며, 볼륨을 불투명해보이게 한다.
우리가 속칭 Godray 혹은 Silver Lining이라고 부르는 현상 또한 태양광선이 볼륨을 지나면서 Forward Scattering을 하기 때문에 광선의 진행방향으로 강한게 산란된 빛이 보이는 것이다
Anisotropy값이 0과 1사이의 값이면 Forward Scatter, 0에서 -1사이면 Backward Scatter이다. 그리고 딱 0의 값이면 Isotropy인 상태이며 즉 사방으로 빛을 고루 산란한다는 의미이다
카르마의 Cloud Material의 프리셋을 꺼내보면 Anisotropy의 값이 디폴트로 0.877인데, 이건 그냥 임의의 숫자가 아니라 구름이라는 볼륨의 물성이 물과 얼음결정으로 이루어져있고, 이 분자의 특성상 빛의 Foward Scatter현상이 두드러지므로 그렇게 설정된 것이라고 한다. (Mie산란이라고 하던데 Whitewater 공부할 때도 본 내용 같음)
[ In-Out Scatter vs. Foward-Backward Scatter ]
여기서 헷갈리는 개념이 나오는데 In-Scattering과 Out-Scattering은 위에 서술한 Forward-Backward와는 다른 개념이다.
In-Scattering은 빛이 산란하면서 관찰자의 눈으로 (3D에선 카메라로) 들어오는 빛의 양이고, 눈으로 들어오는 빛이 증가하니 볼륨이 밝아보이는듯한 느낌을 준다. 그리고 Out-Scattering은 산란된 빛이 관찰자의 눈으로 들어오지 않는 것이다. 그렇게 때문에 볼륨이 더 두껍고 불투명해보인다.
[ Extinction ]
또한 Extinction이라는 개념 또한 여기서 파생되는데, 빛이 흡수 또는 산란되는 현상을 말한다.
Extinction은 빛 감쇄의 총량 즉, Total Attenuation이며 이것은 Absorption + Out-Scattering의 총합이다 (Absorb된 빛, Out-Scattering된 빛을 합하면 Extinction값이다). 쉽게 말해서 빛이 흡수와 산란을 통해 원래보다 얼마나 감쇄했느냐이다.
어짜피 우리의 눈은 빛의 세기가 흡수되어서 감쇄된건지, 산란된 빛이 단지 우리 눈 방향으로 오지 않아서 감소한건지 구분하지 못한다. 중요한 것은 저 두 현상을 통해 빛의 세기가 감쇄했다는 것이고 그것의 총합을 Total Attenuation 혹은 Extinction이라고 칭하는 것이다.
Karma Volume 셰이더를 보면 Extinction Falloff라는 파라미터가 있는데, Falloff값이 크면 광선이 볼륨을 이동하면서 Extinction의 총량이 크게 줄어든다는 의미이며, 감쇄가 광선의 이동거리에 따라서 빠르게 줄어드니 자연스레 볼륨이 밝아보일 것이다. 반대로 Falloff가 높아지면 감쇄가 광선의 이동거리에 따라서 Extinction이 느리게 줄어든다는 의미이니 볼륨은 빛을 더 흡수하여 짙고 불투명하게 보일 것이다.
3. Transmission (투과):
투과는 빛이 산란되지도, 흡수되지도 않는 현상이며 저 두 현상에 의해 빛의 세기가 감쇄되지 않는다. 하지만 두꺼운 볼륨이라면 빛이 온전히 뚫고 지나가기 힘들 것이기 때문에 Transmission값이 낮을 것이며 반대로 옅은 볼륨이라면 빛은 사방으로 퍼지지 않고 쑥 지나갈 확률이 높다.
[ 정리 ]
- 이 모든건 Density와 Volume Limt에 의해서 크게 좌지우지된다. 강약이 보이는 흥미로운 룩을 내기 위해서는 Density자체에서 값의 베리에이션이 있거나 혹은 커스텀하게 Karma ray import노드 등을 이용하여 광선 이동거리의 Exponential값을 더 바꿔줘도 될 것 같다 (근데 그냥 두자.. 어짜피 똑똑한 사람들이 수학적으로 계산해서 다 만들어 둔건데)
- Anisotropy는 마치 IoR처럼 물성에 따라 물리적으로 맞는 값이 있는 것 같으니 웬만하면 그것을 따르고, Exntinction Falloff같은 경우에는 원하는 룩에 따라서 어느정도 자유롭게 바꿔도 될 것 같다. 혹은 Backlit된 라이트만 강조하고 싶다면 의도적으로 Cloud를 Backward Scattering시킨 후 엣지 부분만 Density 마스크를 이용해 Forward Scattering을 시켜도 된다더라. (Use Secondary Anisotropy 토글을 활성화하면 된다)
[ 예시 ]
- 구름의 및부분이 어두운 이유는 그림자져서인 것도 있지만, 윗부분에서부터 받는 태양광이 구름의 밑으로 갈수록 흡수 및 산란되기 때문에 어두워지는 것
- 화재시 발생하는 연기가 짙은색인 이유는 탄소 입자에 의해서 빛이 흡수되기 때문
- 바닷물과 같이 복잡한 유기체들로 구성된 유체 내에서도 Multiple한 Scattering이 이루어지기 때문에 색이 골고루 퍼져보이는 것
RTX 4070으로
- Resoultion : 1920 x 1080
- Volume Step Rate : 0.5
- Volume Limit : 15
- Anisotropy : 0.877
- Extinction Falloff : 0.25
- Density Voxel : 12,919,783
의 XPU 렌더링은 무려 7분 21초가 걸렸다. 확실히 Volume Limit과 Scattering이 활성화되면 렌더타임이 오래 걸린다..
'Houdini' 카테고리의 다른 글
Whitewater 탐구 (0) | 2025.02.15 |
---|---|
Python & Vex in Solaris (1) | 2025.01.05 |
Fog Volume의 표면만 필터링하기 (1) | 2024.11.07 |
Solaris + Copernicus에서 표면에 디테일 주기 (1) | 2024.10.05 |
Non Commercial 힙파일 변환 (1) | 2024.09.25 |