이런 분이 읽으면 좋습니다!

  • 언리얼 엔진5를 사용하면서 빛이 어떻게 계산되는지 궁금했던 분
  • PBR, Lumen, Nanite 같은 용어가 수학적으로 어떤 의미인지 알고 싶은 분

이 글로 알 수 있는 내용

  • 카지야 렌더링 방정식의 각 항이 무엇을 의미하는지
  • UE5의 Nanite, Lumen, VSM이 방정식의 어느 부분을 담당하는지
  • UE5 PBR 재질(GGX BRDF)이 수학적으로 어떻게 작동하는지


Kajiya's Rendering Equation (1986)
Lo(x, ωo) = Le(x, ωo) + Ω fr(x, ωi, ωo) · Li(x, ωi) · cos θi i

1986년 James Kajiya가 발표한 렌더링 방정식은 빛의 전파를 수학적으로 정의한다. 이 방정식이 실시간 엔진에서 어떻게 근사되고 구현되는지 살펴본다.

00 — 그래픽스 파이프라인

그래픽스 파이프라인 개요

카지야 방정식을 실제로 계산하기 전에, UE5가 매 프레임 거치는 그래픽스 파이프라인 전체 흐름을 먼저 보자. 방정식의 각 항은 파이프라인의 여러 단계에 걸쳐 대체로 대응하며, 최종 픽셀 값은 각 패스의 결과를 합성해 얻어진다.
CPU Stage
InitViews
Culling · 분류 · DrawCmd
x 후보 결정 — 계산할 픽셀을 솎아낸다
Frustum/Occlusion/Distance Culling으로 화면 밖 오브젝트 제거. View Relevance로 패스 분류. MeshPassProcessor로 셰이더(fr) 선택.
방정식 전처리 L_o 계산 불필요한 x 제거
GPU Stage 1
Rasterization
삼각형 → 픽셀 변환
x 확정 — 픽셀마다 월드 좌표·법선·UV 결정
버텍스 셰이더 후 삼각형을 픽셀로 분할. 픽셀마다 보간된 월드 포지션(x), 노멀, 텍스처 좌표가 결정된다. Nanite는 이 단계를 Cluster-level 소프트웨어 래스터로 대체.
x 확정 방정식 입력값 생성
GPU Stage 2 ★
Shading
Base Pass · Lumen
방정식 계산 — fr · Li · cosθ 적분
픽셀 셰이더에서 PBR BRDF(GGX) 평가. 직접광은 해석적 계산, 간접광은 Lumen이 surface cache와 tracing으로 근사. 방정식의 핵심 항들(fr, Li, cosθ)이 주로 이 단계에서 평가되지만, 최종 결과는 Shadow, GI, Reflection 등 여러 패스의 기여가 합산된다.
방정식 실제 계산 f_r · L_i · cosθ dω
GPU Stage 3
Output Merger
ROP · Depth · Blend
조명 결과 기록 — 셰이딩 결과를 render target에 쓴다
Depth Test(가시성 최종 확인), Stencil Test, Alpha Blending(반투명 합산). 각 패스에서 계산된 조명 결과가 render target에 누적되고, 이후 Tone Mapping·Exposure·Post Process를 거쳐 최종 디스플레이 색으로 변환된다.
render target 기록 Depth · Blend · ROP
💡 방정식과 파이프라인 대응 요약

InitViews는 "계산할 x를 고른다", Rasterization은 "x 좌표를 확정한다", Shading은 "방정식의 핵심 항들을 주로 평가한다", Output Merger는 "각 패스의 조명 결과를 render target에 누적한다". 방정식의 항들은 Base Pass, Shadow, GI, Reflection 등 여러 패스에 걸쳐 계산되고, 그 결과가 합산되어 최종 픽셀 색이 만들어진다.

01 — 방정식 이해

각 항이 의미하는 것

렌더링 방정식은 "어떤 점 **x**에서 방향 ωo로 나가는 빛의 양"을 정의한다. 이 값을 알면 픽셀의 색을 결정할 수 있다.
Lo(x, ωo)
나가는 복사 휘도 (Outgoing Radiance)

점 x에서 방향 ωo(카메라 방향)로 나가는 빛의 총량. 최종적으로 픽셀에 기록되는 값.

Le(x, ωo)
방출 휘도 (Emitted Radiance)

재질 자체가 발광하는 경우 추가되는 항. 모니터, 네온사인, 불꽃 같은 발광 오브젝트가 해당.

fr(x, ωi, ωo)
BRDF

양방향 반사 분포 함수. "들어온 빛 중 얼마나 반사되어 나가는가"를 결정하는 재질의 핵심.

Li(x, ωi)
들어오는 복사 휘도 (Incoming Radiance)

방향 ωi에서 점 x로 들어오는 빛의 양. 이 값 자체도 재귀적으로 렌더링 방정식을 풀어야 한다.

cos θi
Lambert 코사인 항

빛이 표면에 비스듬히 입사할수록 에너지가 넓게 퍼지는 물리 현상. 법선과 입사 방향의 내적.

Ωi
반구 적분

표면 법선을 기준으로 모든 방향에서 들어오는 빛을 다 더한다. 이 적분이 실시간 렌더링의 핵심 난제.

⚡ 왜 어려운가

Li(x, ωi)를 구하려면 다시 렌더링 방정식을 풀어야 한다. 즉 빛은 재귀적으로 튕기고, 그 모든 경로를 추적하면 무한 연산이 필요하다. 실시간 엔진은 이 무한 재귀를 영리하게 근사한다.

02 — UE5 렌더링 파이프라인

언리얼 엔진5가 방정식을 푸는 방법

UE5는 렌더링 방정식의 각 항을 서로 다른 시스템이 나누어 계산한다. 완벽한 해가 아니라 시각적으로 그럴듯한 근사치를 실시간으로 만들어내는 것이 목표다.
01
Geometry Pass

기하 처리 및 재질 입력 생성 — Nanite + Base Pass

Nanite가 픽셀 단위 정밀도로 가시 기하를 결정하고, 이어지는 Base Pass에서 재질 셰이더가 실행되어 위치(x), 법선, BaseColor, Roughness, Metallic 등이 G-Buffer에 저장된다. Nanite는 rasterization과 visibility를 담당하고, G-Buffer 저장은 deferred base pass의 결과다. 이후 모든 조명 계산의 입력값이 여기서 만들어진다.

Nanite Deferred Shading G-Buffer
02
Direct Light

직접광 — Li × fr × cosθ 직접 계산

태양, 포인트 라이트, 스팟 라이트 등 명시적 광원에서 오는 빛은 방정식을 해석적으로 적용한다. 광원 방향이 정해져 있으므로 반구 적분이 단순화된다. UE5는 Disney식 metallic/roughness 워크플로의 영향을 받은 실시간 PBR 모델을 사용하며, GGX 기반 specular BRDF와 Lambert 계열의 diffuse 근사를 조합한다.

Direct Lighting PBR / GGX BRDF Shadow Map
03
GI Approximation

Lumen — 간접광 (GI) 근사

방정식에서 가장 어려운 부분: 다른 표면에서 한 번 이상 튕겨온 빛. Lumen은 Surface Cache(Mesh Cards), Screen Probe Gather, Radiance Cache, Software Ray Tracing(SDF), Hardware RT fallback을 계층적으로 조합해 scene-space에서 간접광을 근사한다. 단순한 SDF 레이마칭이 아니라 여러 기법의 하이브리드 시스템이다.

Lumen GI SDF Ray Marching Radiance Cache SSGI
04
Reflection

반사 — 거울 방향 Li 추적

광택 있는 표면에서의 반사는 특정 방향 ωi에 집중된 샘플링으로 근사한다. 매끈한 표면일수록 반사 방향성이 강해져 더 높은 정확도의 추적이 필요하며, Lumen은 screen trace, surface cache 조회, hardware ray tracing 등을 플랫폼·설정·hit 여부에 따라 상황에 맞게 조합해 사용한다.

Lumen Reflection Screen Space Reflection Hardware RT
05
Shadow

그림자 — 가시성 함수 V(x, ωi)

빛이 점 x에 실제로 도달하는지 여부를 결정하는 가시성 함수. UE5에서는 이를 Virtual Shadow Maps, screen-space visibility, distance field 기반 occlusion, ray tracing, Lumen 내부의 tracing hit/miss 등 여러 시스템이 나누어 담당하며 상황에 따라 혼합해 사용한다. Nanite VSM은 그 중 주요한 하나로 픽셀 단위 정밀도의 그림자를 메모리 효율적으로 제공한다.

Virtual Shadow Map Screen-space Visibility Distance Field Occlusion Ray Traced Shadow
06
Post Process

포스트 프로세스 — 최종 Lo 보정

계산된 Radiance 값을 실제 디스플레이에 맞게 변환한다. Tone Mapping(HDR → LDR 변환), Exposure, Bloom(발광 오브젝트 Le 항 강조), Temporal Anti-Aliasing이 여기서 처리된다. TSR(Temporal Super Resolution)은 낮은 해상도로 렌더링 후 업스케일해 성능을 확보한다.

Tone Mapping Bloom TSR TAA
03 — 1:1 대응

방정식 항 ↔ UE5 시스템 매핑

방정식 항 물리적 의미 UE5 구현 방식
Lo(x, ωo) 최종 픽셀 색 Final Color Buffer 합산 결과
Le(x, ωo) 재질 자체 발광 Emissive Channel + Bloom 직접 추가
fr(x, ωi, ωo) BRDF (재질 반응) PBR Material (GGX + Lambert) Disney 근사
Li (직접광) 광원에서 직접 오는 빛 Directional / Point / Spot Light 해석적 계산
Li (간접광) 다른 표면에서 반사된 빛 Lumen GI (Surface Cache · Screen Probe · Radiance Cache · Tracing) 하이브리드 근사
Li (환경광) Sky / IBL Sky Atmosphere + SkyLight 큐브맵 컨볼루션
cos θi Lambert 코사인 항 N · L (Shader 내적 연산) 셰이더 내적 계산
V(x, ωi) 가시성 (그림자) VSM · DFAO · RT Occlusion 등 복수 시스템 조합
Ωi 반구 적분 분석적 조명 · 환경맵 사전적분 · Lumen probe · 시간적 누적 복수 기법 조합
04 — BRDF 상세

UE5의 PBR 재질

UE5의 기본 재질 모델은 Disney식 metallic/roughness 워크플로의 영향을 받은 실시간 PBR 모델이다. Disney 원 논문을 그대로 구현한 것은 아니며, Epic이 SIGGRAPH 2013에서 발표한 실시간 근사를 기반으로 한다. BRDF는 Diffuse 항과 Specular 항으로 분리된다.
HLSL (UE5 Shader)
// UE5 PBR BRDF 구조 (단순화) float3 BRDF(MaterialInputs mat, float3 L, float3 V, float3 N) { float3 H = normalize(L + V); // Halfway vector float NdotL = saturate(dot(N, L)); // cosθ — 방정식의 cosθᵢ float NdotV = saturate(dot(N, V)); float NdotH = saturate(dot(N, H)); float roughness = mat.Roughness; // Specular BRDF: D × G × F / (4 × NdotL × NdotV) float D = GGX_Distribution(NdotH, roughness); // 노멀 분포 함수 float G = Smith_Schlick_GGX(NdotL, NdotV, roughness); // 기하 감쇠 float3 F = Fresnel_Schlick(mat.F0, NdotV); // 프레넬 반사율 float3 Specular = (D * G * F) / (4.0 * NdotL * NdotV + 0.001); // Diffuse BRDF: Lambertian (에너지 보존 위해 Specular 뺌) float3 kD = (1.0 - F) * (1.0 - mat.Metallic); float3 Diffuse = kD * mat.BaseColor / PI; return (Diffuse + Specular) * NdotL; // × NdotL = cosθ 항 }
🔵

D — 노멀 분포 함수

GGX/Trowbridge-Reitz 모델. Roughness에 따라 반사 로브의 날카로움을 결정.

🟡

G — 기하 감쇠 함수

Smith's Schlick-GGX. 미세면이 서로 가리거나 반사광을 막는 효과(Shadowing/Masking).

🟢

F — 프레넬 반사율

Schlick 근사. 빛이 표면에 비스듬히 입사할수록 반사율이 증가하는 프레넬 효과.

💡 Metallic/Roughness 파라미터

Metallic과 BaseColor가 함께 specular reflectance(F0)를 결정한다. 비금속의 경우 F0는 약 0.04로 고정되고, Metallic=1에 가까울수록 BaseColor가 specular reflectance를 직접 구성하며 diffuse 기여가 줄어든다. Roughness는 GGX 분포의 α값을 제어해 반사 로브의 날카로움을 결정한다. 이 두 파라미터로 BRDF를 실용적인 수준에서 제어한다.

05 — 간접광의 핵심

Lumen이 GI를 근사하는 방법

렌더링 방정식에서 가장 비싼 부분인 간접광(∫ Lii)을 Lumen은 여러 기법을 계층적으로 조합해 처리한다.

Surface Cache & Mesh Card

씬의 모든 메시에 대해 Mesh Card(텍스처 형태의 표면 캐시)를 생성한다. 각 카드에는 해당 표면의 Radiance가 저장되며, 빛이 바뀌면 점진적으로 갱신된다. Screen Probe Gather가 이 Surface Cache를 scene-space에서 샘플링해 간접광을 누적한다. 인접 표면 간 다중 바운스 간접광도 이 캐시를 통해 반복적으로 근사한다.

Software Ray Marching (SDF)

Signed Distance Field를 활용해 레이를 빠르게 전진시킨다. 정확한 삼각형 교차 검사 없이 "얼마나 가까운 표면이 있는가"만 확인해 레이를 진행시키므로 GPU에서 효율적으로 작동한다. 먼 거리의 GI에 주로 사용된다.

Hardware Ray Tracing (선택적)

DXR/Vulkan RT 지원 GPU에서는 실제 레이트레이싱으로 근거리 GI 및 반사를 계산한다. Lumen은 Software RT(원거리)와 Hardware RT(근거리)를 혼합해 품질과 성능을 동시에 달성한다.

📐 반구 적분의 실시간 근사

실시간 엔진은 반구 적분을 직접 계산하지 않는다. UE5는 분석적 직접광 계산, 환경맵 사전적분(IBL convolution), Screen Probe 기반 중요도 샘플링, Radiance Cache를 통한 공간 재사용, Temporal Accumulation을 통한 시간적 누적을 조합해 적분을 근사한다. 각 기법은 적분의 서로 다른 주파수 영역을 담당한다 — 저주파 영역(diffuse GI, irradiance)은 probe와 캐시로, 고주파 영역(glossy reflection, sharp visibility)은 tracing과 screen-space 기법으로 처리하는 방식이다.

마치며

렌더링 방정식은 "이상"이고, UE5는 "현실"이다

카지야의 방정식은 빛의 완벽한 물리적 거동을 기술하지만, 완전히 푸는 것은 오프라인 레이트레이싱에서도 수 시간이 걸린다. UE5는 Nanite, Lumen, VSM, TSR 등의 시스템으로 각 항을 지능적으로 근사해 초당 60프레임의 실시간 렌더링으로 구현해낸다. 이것이 "Physically Based Rendering"의 본질이다 — 물리를 흉내 내되, 영리하게.