Skip to content

GS Volumetric Lighting (SH Density)

Technical Docs · Gaussian Splat · Rendering

Volumetric
Lighting

SH Density 기반 라이팅 모델

Gaussian splat 기반 반투명 볼륨 렌더링에서 정렬 기반 ODT 누적을 유지하면서 방향성 라이팅, 환경 반사, 직접광 하이라이트를 안정적으로 계산한다. 표면 노멀 재구성 없이 density 분포 자체를 방향 함수로 취급하여 라이팅을 수행한다.

SH L2/L3 ODT IBL Volumetric No Normal

기본 파이프라인

픽셀 단위로 depth 정렬된 splat 리스트를 사용하여 ODT 누적을 수행한다. 동시에 픽셀의 방향 밀도 분포를 SH로 누적한다.

01
Depth Sort
픽셀별 splat 리스트를 depth 기준 front-to-back 정렬
02
ODT Accumulate
w = T × alpha 가중치로 albedo · density 누적, T 감쇠
03
SH Accumulate
동일 가중치 w로 splat 방향을 SH basis에 투영하여 누적
04
SH Shading
dot(SH_density, SH_light) 로 최종 라이팅 계산
ODT + SH 누적 루프
T = 1
for splat in sorted:
    w = T * alpha

    accum_albedo  += w * albedo
    accum_density += w * density

    // 방향 밀도를 SH로 동시 누적
    dir = splat_direction   // view→splat 또는 splat orientation
    SH_density += w * SH_basis(dir)

    T *= (1 - alpha)
결과 버퍼
accum_albedo 투과율 가중 누적 색상
accum_density 투과율 가중 누적 밀도
SH_density 방향 밀도 분포 (SH 계수)
속성별 누적 전략
albedo · smooth · metallic은 각기 다른 방식으로 누적한다. 모두 동일한 ODT 루프 안에서 계산된다.
albedo
표준 ODT 누적

transmittance 가중치 w = T × alpha를 그대로 사용한다. 모든 레이어가 투과율에 비례해 기여한다.

w = T * alpha
accum_albedo += w * albedo
smooth
전방 bias 누적

처음 N개의 splat에 강한 bias를 적용한다. 표면에 가장 가까운 레이어의 smoothness가 지배적으로 반영된다.

bias = FrontBias(splat_index, N)
w_s  = T * alpha * bias
accum_smooth += w_s * smooth
metallic
첫 유효 스플랫

누적 density가 임계값 x를 처음 초과하는 splat의 metallic을 사용한다. 표면 재질 특성을 단일 값으로 결정한다.

if !found && accum_density >= x:
    metallic = splat.metallic
    found = true

SH Density 정의

픽셀 내부의 splat 분포를 방향 함수로 근사한다. SH order는 L2 또는 L3 사용.

근사식
ρ(ω) ≈ SH_density
SH_density = Σ wi · Ylm(diri)
wi = transmittance weighted alpha
Ylm = spherical harmonics basis function
diri = view→splat 또는 splat orientation
SH ORDER L2 / L3
SH_density 가 인코딩하는 정보
방향별 밀도
어느 방향에 얼마나 많은 splat이 있는지
전방 우선성 (ODT)
카메라에 가까운 splat에 더 높은 가중치
레이어 구조
depth 순서에 따른 레이어 정보 보존
부분 차폐
alpha 가중치를 통한 가림 정도 반영
두께
누적 밀도에서 볼륨 두께 정보 추출 가능

라이팅 모델

라이팅도 SH로 표현한다. 픽셀 라이팅은 SH 내적 형태로 계산한다.

SH 내적 라이팅
lighting = dot(SH_density, SH_light)
위 식은 아래 적분의 근사
∫ ρ(ω) L(ω) dω
ρ(ω) 방향별 밀도 분포  ·  L(ω) 방향별 라이팅
라이팅 표현
L(ω) ≈ SH_light

lighting = dot(SH_density, SH_light)
이 방식의 특징
표면 노멀 불필요
per-splat normal 재구성 과정 없음
iso surface 불필요
명시적 표면 추출 없이 라이팅 가능
ddx / ddy 불필요
스크린 공간 미분 기반 노멀 추정 없음
bent normal 불필요
AO 방향 보정 없이도 방향성 반영

라이팅 소스 — IBL

라이팅 소스는 IBL(SH)이다. 직접광도 별도로 처리하지 않고 SH 방향 분포로 인코딩한다. density를 SH로 누적했기 때문에, 광원 종류에 관계없이 dot(SH_density, SH_light) 하나로 계산이 통일된다.

통일된 라이팅 계산식
lighting = dot(SH_density, SH_light)
광원 종류에 무관 — 인코딩 방식만 다르다
직접광을 IBL로
directional light → SH lobe

직접광도 SH 방향 분포로 인코딩하여 IBL처럼 취급한다. 단일 방향이면 델타 함수에 가까운 sharp SH, cone lobe로 확장하면 highlight 폭을 조절할 수 있다.

인코딩
// 단일 방향 → sharp SH lobe
SH_light = SH(dirLightDir)

// cone lobe 확장 (highlight 폭 제어)
SH_light = SH_cone(dirLightDir, width)
라이팅 계산
direct = dot(SH_density, SH_light)
방향성 하이라이트 생성 front-biased 응답 레이어 구조 반영
환경광 / 반사 / IBL
environment map → SH

환경맵 전체를 SH로 변환한다. SH_density와 내적하면 방향 밀도 분포에 따른 환경광 응답을 얻는다. 반사·간접광·IBL 모두 동일한 방식으로 처리된다.

인코딩
// 환경맵 → SH 변환
SH_env = ConvertEnvmapToSH(cubemap)
라이팅 계산
env = dot(SH_density, SH_env)
reflection 느낌 생성 방향성 유지 rough surface 자연스러움 반투명 구조와 일관성

Roughness 처리

roughness는 SH blur로 처리한다. light side를 blur하는 방법 A와 density side를 blur하는 방법 B 중 선택한다.

방법 A Light Side Blur
SH_light 를 blur하여 highlight 폭을 조절한다. 광원의 응답 범위를 넓혀서 glossy → diffuse 전환을 표현한다.
구현
SH_light_rough = BlurSH(SH_light, rough)
lighting = dot(SH_density, SH_light_rough)
VS
방법 B Density Side Blur
SH_density 를 blur하여 방향 응답성을 완화한다. 밀도 분포 자체의 방향 선호도를 낮춰서 diffuse 느낌을 준다.
구현
SH_density_rough = BlurSH(SH_density, rough)
lighting = dot(SH_density_rough, SH_light)
roughness 증가에 따른 효과
glossy
highlight 폭 확대
diffuse
GGX 없이도 specular 느낌 표현 가능

최종 셰이딩

직접광과 환경광 기여를 합산하고 accum_albedo를 곱해 최종 색상을 구한다. accum_density로 Beer, Powder, AO 효과를 추가할 수 있다.

HLSL — 최종 셰이딩
float3 light =
    dot(SH_density, SH_direct)   // 직접광
  + dot(SH_density, SH_env);     // 환경광

float3 color =
    accum_albedo * light;
추가 가능한 효과 (accum_density 활용)
Beer(accum_density) 밀도에 비례한 깊이별 빛 흡수. 두꺼운 볼륨일수록 어두워짐
Powder(accum_density) 표면 가장자리 밝기 강조. 분말·연기 느낌 강화
AO(accum_density) 밀도 기반 주변광 차폐. 조밀한 영역 어둡게 처리
SECTION 08 · 특성 요약
ODT 기반 누적 유지
기존 정렬 파이프라인과 완전 호환
반투명 레이어 안정적
알파 블렌딩 아티팩트 없이 레이어 처리
방향성 라이팅 · specular · reflection
SH dot product 하나로 모두 표현
노멀 재구성 불필요
surface proxy · iso surface · ddx/ddy · bent normal 전부 불필요
GS 구조와 정합성 높음
Gaussian splatting 고유 특성을 자연스럽게 활용