Lighting
들어가며
이 글은 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) 을 선택
GI(Global Illumination) 은 Direct Light 와 Indirect Light 로 나뉜다.3 차례로 살펴보자.
Direct Light
RDF(Reflectance Distribution Function) 는 보통 다음 4가지를 고려되어 만들어진다.
- Energy Conservation
- Model of Micro-facets or Surface roughness
- Model Metalness
- 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)
참고자료
Filament PBR html 에 이미지 로딩시간이 좀 기니 주의.
-
Unity3 Light Probe Doc. 여기에 실린 Paper 와 PPT 가 진국. ↩
-
엔비디아에서 간략하게 중요 용어를 정리했다. Scaling Probe-Based Real-Time Dynamic Global Illumination for Production ↩
댓글남기기