PART 5 · 강의 2/3

3D Gas Simulation

Grid3D 기반 볼류메트릭 3D 가스/연기 시뮬레이션과 레이마칭 렌더링을 학습합니다.

01

3D 볼류메트릭 시뮬레이션

Grid3D Collection으로 3차원 유체 구현

Grid3D 기반 시뮬레이션은 3차원 공간에서 유체 역학을 시뮬레이션합니다. 2D와 동일한 나비에-스토크스(Navier-Stokes) 방정식을 3D로 확장하며, 볼류메트릭 렌더링으로 입체적인 연기/가스 효과를 생성합니다.

Grid3D 시뮬레이션 구조
3D Gas System Grid3D Collection: Resolution: 128 x 128 x 128 // 메모리: 약 128^3 * 채널수 * 4bytes // 128^3 * 6채널 * 4B = ~48MB GPU 메모리 Attributes: Velocity (float3) // 3D 속도장 Density (float) // 가스 밀도 Temperature (float) // 온도 (부력) Fuel (float) // 연료 (연소 시뮬레이션) Pressure (float) // 압력 Divergence (float) // 발산 (압력 solve용) Simulation Stages: 1. Advect // Semi-Lagrangian 이류 2. Add Buoyancy // 온도 기반 부력 3. Inject Source // 밀도/온도 주입 4. Compute Divergence 5. Pressure Jacobi // N회 반복 (20~40) 6. Subtract Gradient 7. Dissipation // 밀도/속도 감쇠
메모리와 성능

3D 시뮬레이션의 비용은 해상도의 세제곱으로 증가합니다. 해상도를 2배로 올리면 비용이 8배 증가합니다. 게임에서는 64~128, 시네마틱에서는 128~256 해상도를 권장합니다.

02

3D Gas 템플릿 설정

Niagara Fluids 3D 템플릿 활용

3D Gas 템플릿 생성 및 설정
// Niagara System 생성 우클릭Niagara SystemNiagara FluidsGrid 3D Gas Dynamics Master Emitter // 핵심 파라미터 조정 Grid Resolution: X: 64, Y: 64, Z: 64 // 시작 해상도 World Size: 500 x 500 x 500 cm // 시뮬레이션 영역 Pressure Iterations: 30 // 높을수록 비압축성이 잘 유지됨 (비용 증가) // 게임: 10~20, 시네마틱: 30~50 Density Dissipation: 0.97 Temperature Dissipation: 0.95 Velocity Dissipation: 0.98 Buoyancy: Direction: (0, 0, 1) // 위쪽 Strength: 10.0 Vorticity Confinement: 5.0 // 소용돌이 디테일 보존. 높으면 더 소용돌이침
03

볼류메트릭 렌더링

Ray Marching으로 3D 가스 시각화

3D 유체의 밀도 데이터는 레이 마칭(Ray Marching)으로 렌더링됩니다. 카메라에서 쏜 광선이 볼륨을 통과하면서 밀도를 누적하여 연기의 불투명도를 계산합니다.

볼류메트릭 렌더링 개념
// Ray Marching 머티리얼 원리 (의사 코드) for (int step = 0; step < MaxSteps; step++) { float3 SamplePos = RayOrigin + RayDir * StepSize * step; // Grid3D에서 밀도와 온도 샘플링 float Density = SampleGrid3D(SamplePos, "Density"); float Temp = SampleGrid3D(SamplePos, "Temperature"); // 온도에 따른 색상 (차가운=회색, 뜨거운=주황) float3 Color = lerp(SmokeColor, FireColor, Temp); // Beer-Lambert 법칙으로 투과율 계산 Transmittance *= exp(-Density * AbsorptionCoeff * StepSize); // 라이팅 (그림자 레이 추가 가능) AccumulatedColor += Color * Density * Transmittance * StepSize; } // Niagara Fluids 템플릿에는 이 머티리얼이 포함되어 있음
렌더링 파라미터 설명 성능 영향
Max Steps 레이 마칭 최대 반복 수 높음 (직접 비례)
Step Size 샘플 간격 (작을수록 정밀) 높음 (반비례)
Absorption 빛 흡수 계수 (불투명도) 없음
Shadow Steps 자기 그림자 레이 반복 매우 높음
04

성능 최적화 전략

게임에서 사용 가능한 3D 유체

최적화 방법 트레이드오프
해상도 감소 64^3 또는 48^3 사용 디테일 감소, 블러로 보완
Pressure 반복 감소 10~15회로 제한 비압축성 저하 (약간의 팝핑)
비대칭 해상도 Y축(높이)만 높게 설정 수직 디테일 유지, 수평 절약
LOD 거리에 따라 해상도/비활성화 먼 거리에서 품질 저하
시간 제한 짧은 수명으로 일시적 효과 지속적 이펙트에 부적합
하이브리드 접근

3D 유체와 전통적 파티클을 조합하면 효과적입니다. 핵심 영역(폭발 중심)만 3D 유체로 처리하고, 외곽의 연기/파편은 일반 Sprite 파티클로 보충하면 비용을 크게 줄이면서 완성도를 유지할 수 있습니다.

SUMMARY

핵심 요약

  • Grid3D 기반 시뮬레이션은 3차원 나비에-스토크스 방정식으로 볼류메트릭 유체를 구현합니다.
  • 비용은 해상도의 세제곱으로 증가하므로, 게임에서는 64~128 해상도를 사용하세요.
  • Ray Marching으로 밀도 데이터를 볼류메트릭 렌더링하며, Step 수가 성능에 직접 영향을 줍니다.
  • Vorticity Confinement으로 소용돌이 디테일을 보존할 수 있습니다.
  • Pressure Iterations를 줄이면 비용이 감소하지만 비압축성이 저하됩니다.
  • 3D 유체와 전통적 파티클을 하이브리드로 조합하면 비용 대비 높은 완성도를 달성할 수 있습니다.
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 3D Gas 시뮬레이션 기초

Grid3D Collection을 사용하여 3D 가스 시뮬레이션을 설정하세요. 온도(Temperature)에 따른 부력과 밀도(Density) 소멸을 구현하여 기본적인 화염 기둥 이펙트를 만드세요.

실습 2: 폭발 가스 이펙트

구체 영역에서 초기 밀도와 온도를 높은 값으로 분사(Inject)하여 폭발 시뮬레이션을 만드세요. Turbulence와 Dissipation Rate를 조절하여 폭발 후 연기가 퍼지는 과정을 표현하세요.

심화 과제: Volumetric 렌더링 최적화

Volume Renderer의 Ray March Step Count, Shadow Step Count를 조절하며 품질과 성능의 균형을 찾으세요. LOD Distance에 따라 해상도를 동적으로 조절하는 시스템을 구현하세요.