LYSC STUDIO

LIST
Cover

레이마칭(Raymarching)과 3D 노이즈를 활용한 실시간 볼류메트릭 클라우드 렌더링 기법

·3D Art & Tech

밀도 높은 구름의 부피감과 다중 광산란 효과를 실시간으로 구현하기 위해, 3D 텍스처 노이즈와 레이마칭 알고리즘을 융합하는 최첨단 렌더링 아키텍처를 심도 있게 다룹니다.

1. 차세대 대기 렌더링의 도래

게임 속 하늘은 과거 2D 스카이박스나 구 형태의 돔에 텍스처를 투영하는 방식에서 벗어나, 이제는 실제 부피를 가진 유체 역학적 덩어리로 진화했습니다. 볼류메트릭 클라우드(Volumetric Clouds) 렌더링은 AAA 게임에서 그 진가를 발휘하며 실시간 그래픽스의 패러다임을 바꿨습니다. 단순한 폴리곤 메시가 아닌 밀도(Density)의 집합체인 구름을 렌더링하기 위해서는 전통적인 래스터라이제이션(Rasterization) 파이프라인을 벗어나, 광선 투사 기법인 레이마칭(Raymarching)과 절차적 노이즈(Procedural Noise)의 세계로 진입해야 합니다.

2. 볼류메트릭 렌더링의 수학적 모델

구름이나 안개와 같은 참여 매질(Participating Media)을 렌더링할 때는 빛이 매질 내부를 통과하며 겪는 흡수(Absorption), 외산란(Out-scattering), 내산란(In-scattering), 그리고 발광(Emission)을 수치적으로 적분해야 합니다. 비어의 법칙(Beer's Law)은 매질을 통과하는 빛의 투과율이 매질의 밀도와 이동 거리의 지수 함수에 반비례하여 감소함을 설명합니다. 또한, 빛이 입자 부딪혀 어느 방향으로 산란될지 결정하는 위상 함수(Phase Function)로는 보통 Henyey-Greenstein 위상 함수가 사용됩니다.

3. 레이마칭(Raymarching) 알고리즘의 구현

레이마칭은 카메라(눈)에서 스크린의 각 픽셀을 향해 가상의 광선을 발사하고, 이 광선이 3D 공간을 일정 간격(Step)으로 전진하며 샘플링하는 기법입니다. 볼류메트릭 클라우드에서는 광선이 대기권과 교차하는 지점을 시작점으로 잡고 마칭을 시작합니다. 각 스텝마다 우리는 현재 위치의 '구름 밀도'를 평가해야 합니다. 밀도가 0보다 크다면 구름 내부에 진입한 것이며, 이때 광원을 향해 2차 광선을 쏘아 올려 빛이 얼마나 감쇠되었는지를 계산하여 내산란 양을 결정합니다.

4. 절차적 밀도 함수: 3D 노이즈의 예술

구름의 형상을 결정하는 '밀도 함수'는 메모리 낭비 없이 무한한 구름 지형을 생성하기 위해 3D 절차적 노이즈 텍스처를 활용합니다. 가장 널리 쓰이는 기법은 펄린 노이즈(Perlin Noise)와 월리 노이즈(Worley Noise)를 합성한 Perlin-Worley 노이즈입니다. 낮은 주파수의 노이즈 텍스처를 사용하여 구름의 큼직한 형태를 잡고, 높은 주파수의 노이즈를 뺄셈하여 구름의 가장자리가 흩어지는 디테일하고 폭신폭신한 질감을 만들어냅니다.

5. 극한의 최적화 전략 (Performance Optimization)

픽셀 단위로 수십 번의 3D 텍스처 샘플링과 적분 연산을 수행하는 레이마칭은 GPU 성능을 극한으로 소모합니다. 따라서 실시간 적용을 위해서는 대대적인 최적화가 동반되어야 합니다. 첫 번째 방법은 체커보드 렌더링(Checkerboard Rendering)과 시간적 재투영(Temporal Reprojection)입니다. 4x4 픽셀 블록 중 1픽셀만 렌더링한 후, 카메라의 이전 프레임 데이터를 활용하여 블렌딩합니다. 두 번째로, 구름 밀도 맵(Weather Map) 2D 텍스처를 활용해 구름이 존재하지 않는 공간의 연산을 건너뛰는(Empty Space Skipping) 최적화가 필수적입니다.

6. 결론

볼류메트릭 클라우드는 광학적 물리 법칙, 고급 절차적 생성 알고리즘, 그리고 GPU 하드웨어에 대한 극한의 최적화가 집대성된 기술입니다.

Implementation Code
float4 RenderVolumetricClouds(float3 rayOrigin, float3 rayDir)
{
    float transmittance = 1.0;
    float3 scatteredLight = float3(0.0, 0.0, 0.0);
    // 렌더링 루프 및 3D 텍스처 샘플링 로직 생략
    return float4(scatteredLight, transmittance);
}
구름은 게임 월드에서 감성을 전달하는 거대한 캔버스입니다. 레이마칭을 통해 얻어낸 입체적인 광원 효과는 웅장함을 선사합니다.