Lighting

18 분 소요

들어가며

이 글은 Light 에 관해서 잡다하게 정리한 글이다.

체계적인 개념을 위해선 우선 LifeIsForu 의 PBR 이란 무엇인가 시리즈 를 살펴보자.

개념

Light 를 Graphics 로 구현하기 위해서 크게 두가지 요소가 있다.

Luminance

첫번째로 Luminance(휘도) 를 계산하는 방식이다. Illuminance(조도) 와도 헷갈릴 수 있는데 Illuminance 는 단위 면적이 당 빛이 들어오는 양이고 Luminance 는 어떤 물질이 반사 등을 통해 (사람의 눈으로) 보내는 빛의 양이다.

Luminance 에 영향을 주는 요소는 대표적으로 다음이 있다.

  • Reflect. Diffuse Reflect(정반사) 와 Specular Reflect(난반사) 로 나뉜다.
  • Scattering
  • Transmitted
  • Absorbed
  • Emissive

이중에서 가장 중요한 것이 Reflect 으로 RSD(Reflected Scattering Distribution) 로 어떤 모델(함수)를 쓰냐에 따라서 결과가 많이 달라진다. 이에 대한 대표적인 것이 Phong 모델이다.

Light Source

두번째로 Light Source 의 종류에 따라서 구현하는 방식이 달라진다.

  • Global Light / Local Light (감쇄 유무)
  • Direct Lighting / Indirect Lighting

Light Source 가 가지는 빛의 양은 여러 단위로 표현할 수 있다.

  • Illuminance(조도) - 일정 범위의 물체가 받는 빛의 양. 단위는 Lux 를 많이 쓴다.
  • Luminous Flux(光束) - Light Source 가 내뿜는 총 빛의 양. 단위는 Lumen(lm) 을 많이 쓴다.
  • Luminous Intensity(광도) - Light Source 의 Solid Angle(1 Steradian(sr)) 범위에서의 빛의 양. 단위는 Candela(cd) 를 많이 쓴다.

각 단위의 관계는 수식으로 나타내면 아래와 같다. 이때 \(I\) 는 Luminous Flux, \(r\) 은 광원에서 표면까지의 거리고 \(\theta\) 는 광원과 표면의 노말이 이루는 각도이다. 참고로 두번째 식은 Lambert Cosine Law 와 거리에 따른 감쇄에 따라 구해지는 식이다.

\[\begin{multline} \shoveleft \text{Luminous Intensity} = \cfrac{I}{4\pi} \\ \shoveleft \text{Illuminous} = \cfrac{I}{4\pi} \cfrac{\cos{\theta}} {r^2} \end{multline}\]

Baking

Light Source 된 결과를 미리 계산하고 저장할 수 있다. Precalcuate 하는 방법은 크게 LightMap 와 LightProbe 로 나뉜다. 오픈월드가 아니라면 LightMap 과 LightProbe 는 병행해서 사용된다.

  • UV Based Method(Light Mapping)
    • 간단하게 정확한 Indirect Light 를 표현할 수 있다.
    • 하지만 Scene 의 변화를 반영할 수 가 없고, LightMap 에서 UnWrapping 하는데 비용이 있다는 점이 있다.
    • 또한 메시의 크기, 메시의 갯수에 따라 좋은 퀄리티를 위한 LightMap 의 크기가 커진다.
  • IBL and Light Probe Interpolation
    • Mesh 가 움직여도 적용가능하고 오픈월드에서도 비용이 상대적으로 저렴하다.
    • 하지만 빠른 Probe 보간과 Probe 차폐 알고리즘이 아직 완벽하지가 않다. 특히 실내 공간의 벽면 같은 경우 안쪽과 바깥의 간접광이 차이가 나므로 두드러진다.
  • 자세한건 여기의 1장 참고

Light Probe

게임엔진에서 Light Probe 는 LightMap 을 사용하기 힘든 Object 에 대해 사용한다. 보간 및 차폐 관련 알고리즘은 다르지만 공통적으로 큰 물체나 지형에 대해서는 사용하기가 어렵다.

  • Unity31 에서는 Light Probe 들을 정점으로 해 Delaunay Tessellation 으로 다면체를 만든다. 그 다면체는 여러 tetrahedron(사면체) 으로 이루어지고 Object 가 들어있는 tetrahedron 내의 무게중심 좌표를 사용해 보간을 수행한다. . World Position of Object 기반이라 큰 물체에 대해서는 Light Probe Volumatic 같은 비싼 옵션을 써야한다.
  • Ue4 에서는 Volumatric LightMap(구 Indirect Light Cache) 가 Light Probe 을 이용한다. Octree 비슷한 구조를 이용해 Static Mesh 근처에 더 많은 Probe 를 배치한다. Octree 의 Node 에 따라 최소 Voxel 간 거리의 1배부터 8배까지 LightProbe 가 배치된다. Light Probe 를 사이에 두고 빛의 차이가 심해지면 빛이 뚫고오는 단점이 있으니 큰 물체는 Static 으로 LightMap 으로 처리되도록 해야한다.

UE4 에서 사용

  • Ue4 에는 LightMap, ShadowMap, Volumatric LightMap(구 Indirect Light Cache) 가 해당되며 아래 표 참고.2
  • Ue4 에서 StaticMesh 의 설정에 LightMap 관련 설정이 있다. 만약 LightBuild 시 검게되면 LightMap Resolution 을 64, LightMap Coordinate Index 를 1 로 바꾸어보자. 튜토리얼 참고.
Mesh \ Light Static Stationary Movable
Static DL - LightMap
Sh - ShadowMap
IL - LightMap
DL - RealTime
Sh - ShadowMap
IL - LightMap
DL - RealTime
Sh - RealTime
IL - None
Stationary DL - Volume
Sh - None
IL - Volume
DL - RealTime
Sh - RealTime
IL - Volume
DL - RealTime
Sh - RealTime
IL - None
Movable DL - Volume
Sh - None
IL - Volume
DL - RealTime
Sh - RealTime
IL - Volume
DL - RealTime
Sh - RealTime
IL - None

Phong Model

보통 3가지 요소로 구현한다.

  • Diffuse. Lambert 조명이라고도 불리는 saturate(dot(Normal, Light)) * light_color * model_color 식을 사용한다.
  • Specular. Blinn-Phong Reflection Model이라고 불리는 saturate(dot(reflect, view))^shineness * light_color * model_color를 사용한다.
  • Ambient. 간단하게는 기본값을 넣거나 HemiSphere Ambient 를 사용한다. 복잡하게는 AO 등을 사용한다.

이와 같은 모델은 파라미터 조절하는 방법이 다양해서 자연스러운 결과물을 가져오기가 어렵다. 또한 모델의 특성 상 에너지 보존 법칙(들어오는 빛보다 반사되는 빛이 더 많음)을 어기게 되는데 부자연스럽다. 이외에도 현실의 반사법칙과 맞지않는 부분이 있어 부자연스럽다. 이에 따라 대두되는 것이 PBR 이다.

PBR

Disney 에 의해서 발전되었고 후에 UE4 같은 상용엔진들에서 채택한 라이트 모델링이다. 어떤 규정이 있다기보단 사실적인 그래픽을 추구한다는 개념적인 특성에 가까우며 사람마다 꼽는 특성은 다르지만 공통적인 것이 몇가지 있다.

  • Energy Conservative
    • 들어오는 빛보다 나가는 빛이 많지 않지 않음.
    • 이에 대한 모델로 Rendering Equation 을 사용
  • Microfacet 을 고려
  • 물리법칙에 기반한 BRDF(Bidirectional Reflectance Distribution Function) 을 선택

(중요)Learn OpenGl

LifeIsForu 의 PBR 시리즈

주요 수식

PBR 시뮬레이션

GI(Global Illumination) 은 Direct Light 와 Indirect Light 로 나뉜다.3 차례로 살펴보자.

Direct Light

RDF(Reflectance Distribution Function) 는 보통 다음 4가지를 고려되어 만들어진다.

  1. Energy Conservation
  2. Model of Micro-facets or Surface roughness
  3. Model Metalness
  4. Fresnel Effect

Albedo( 표면 반사율 ), BRDF( Bidriectional Reflectance Distribution Function, 양방향 반사도 분산 함수 ), BTDF( Bidirectional Transmittance Distribution Function, 양방향 투과도 분산 함수 )

UE4 에서는 기본으로 SSR 과 Reflection Capture Actor 를 사용해서 정반사를 지원한다.

Indirect Light

Direct Light 와 달리 Indirect Light 는 계산하기가 복잡하므로 RealTime Rendering 에서는 Precalculate 한다. 그래서 움직이는 광원에 대해서는 보통 적용하지 않는다. UE4 의 Light Propagation Volume 등을 사용하면 적용이 되는 경우도 있지만 성능상 사용처가 제한된다.

Precalcuate 하는 방법은 크게 UV Based Method(Light Mapping) 와 IBL and Light Probe Interpolation 으로 나뉜다. 자세한건 앞에서 설명했다.

DDGI(Dynamic Diffuse Global Illumination)

SH

질문

LightMap

CubeMap

EnvironmentMap Guild

GTA 에서 배우는 Graphics

예제

참고자료

Filament PBR html 에 이미지 로딩시간이 좀 기니 주의.

  1. Unity3 Light Probe Doc. 여기에 실린 Paper 와 PPT 가 진국. 

  2. PBR 이란 무엇인가 13 

  3. 엔비디아에서 간략하게 중요 용어를 정리했다. Scaling Probe-Based Real-Time Dynamic Global Illumination for Production 

댓글남기기