주의 : 잘못된 내용이 포함되어 있을 수 있으므로 이상하면 참고자료를 확인하세요.


[ PBR 이란 무엇인가 ] 10. Image Based Lighting

Global Illumination & Indirect Lighting ] 에서는 GI 를 위해 indirect light 가 고려되어야 한다고 했습니다. 

광원이 있는 경우라면 그것을 통해 indirect light 를 계산할 수 있죠. 하지만 현실적으로 모든 light 를 배치하는 것은 힘듭니다. 그렇기 때문에 이를 근사계산하기 위해 그래픽스 연구자들은 indirect light 를 image 로부터 얻어 오는 방법에 대해서 고민했고, 요새 자주 사용되는 Image Based Lighting( IBL ) 이라는 개념을 생각해 냈습니다.

이 문서에서는 이 기법이 어떻게 발전해 왔는지, 구체적으로 어떤 개념인지에 대해 다루도록 하겠습니다. UE4 에서 IBL 이 사용되는 방식에 대해서는 시리즈의 다음 문서에서 다루도록 하겠습니다.

아티스트 분들은, 글 내용 중에 이상한 개념들이 나오는데, 너무 어렵게 생각하지 마시고 그냥 그런게 있다고 생각하고 넘어가시기 바랍니다. 언급을 안 하기도 그렇고 하기도 그렇고 그래서 대충 개념만 썼는데, 어려울 수 있습니다. 그냥 기본 설명과 그림을 위주로 보시기 바랍니다. 어려운 개념들은 몰라도 크게 상관은 없는 것들입니다.

Cubemap

그래픽스 카드들은 큐브맵이라는 것을 지원합니다. 큐브맵은 어떤 시점을 중심으로 둘러싼 환경들을 미리 렌더링해서 저장할 수 있는 텍스쳐입니다. 보통 특정 위치에서 여러 방향으로 사진을 찍은 다음에 그것을 보정해서 합치는거죠. 이러한 큐브맵이 실시간 그래픽스에서 가장 먼저 사용된 곳이 SkyBox 와 SkySphere 였습니다.

그림1. 스카이 큐브맵. 출처 : Rendering a skybox using a cube map with opengel and glsl.

그림2. 그림1 의 렌더링 결과. 출처 : 그림1 과 같음.

보통 원경에다가 사용했기 때문에 거리에 의한 왜곡의 영향도 덜 받았으며 가시 품질도 나름 괜찮았죠.

Environment Mapping

그런데 텍스쳐를 이용해 금속의 반사 소스로 활용하려는 움직임이 있었습니다. 1976 년에 Blinn 과 Newell 이 "Texture and reflection in computer generated images" 라는 논문에서 이 개념에 대해 발표한 바가 있고 80 년와 90 년대 초반에 여러 사람에 의해 사용되고 발전해 왔습니다( 자세한 내용에 대해 알고 싶으시다면 [1] 의 문서를 확인하세요 ).

이러한 방식을 Environment Mapping( 환경 매핑 ) 혹은 Reflection Mapping( 반사 매핑 ) 이라 부릅니다. 특히 그래픽스 하드웨어가 지원하는 큐브맵을 이용하면 이를 쉽게 표현할 수 있습니다.

그림3. Environment Mapping 예제. 출처 : Environment Mapping, Han-Wei Shen.

큐브맵의 좌표는 그림4 처럼 큐브( 정육면체 )의 중심을 원점으로 하는 좌표계로 표현됩니다.

그림4. 큐브맵 좌표계. 출처 : CS 354 Texture Mapping.

그렇기 때문에 그림5 에서 볼 수 있듯이, 표면의 normal 과 viewer 를 향한 vector 를 알게 되면 반사벡터를 쉽게 알 수 있습니다.

그림5. 환경 매핑 좌표 구하기. V 는 View 에서 서피스까지의 벡터, N 은 노멀, Vr 은 반사 벡터. 출처 : Mapping Techniques.

그림5 에서 큐브가 아니라 구가 나와서 헷갈리는 분도 계실 수 있지만, 구는 그림6 처럼 큐브에 매핑될 수 있습니다. 벡터는 길이는 달라도 방향이 동일하면 정규화( normalize )했을 때 같은 벡터가 됩니다. 그것을 큐브맵의 좌표로 사용합니다.

그림6. sphere 와 cube 에서 벡터.

이때까지는 EnvironmentMapping 이라는 것이 금속의 반사를 표현하기 위한 소스의 역할만 하고 있었습니다.

Image Based Lighting

그렇지만 하드웨어 성능이 더 발전하면서 Environment Mapping 을 한 단계 더 발전시켜 광원으로 만드려는 시도가 있었으며, 이것이 바로 Image-Based Lighting( IBL, 이미지 기반 조명 ) 개념입니다. 이것에 대해 주도적으로 연구한 사람은 Paul Debevec 이라는 분인 것 같더군요[2]( [2] 에 가면, 2003 년까지의 HDR 및 IBL 관련 자료들에 대한 링크가 많습니다. 관심있는 분들은 확인해 보시기 바랍니다 ).

IBL 과 Environment Mapping 의 가장 큰 차이는 이미지 소스가 광원으로서 사용되느냐 그렇지 않느냐에 있습니다.

IBL Diffuse

표면에 들어 온 빛은 그림7 처럼 반사( reflected ), 투과( transmitted ), 흡수( absorbed )됩니다. 

 

그림7. 빛의 반사, 투과, 흡수. 출처 : Waves, KaiserScience.

그 중에서 반사 성분은 그림8 처럼 크게 diffuse reflection( 난반사 ) 과 specular reflection( 정반사 ) 로 나뉘죠. 다들 이 개념에 대해서는 익숙할 것입니다. 그런 현상이 왜 발생하는지는 시리즈의 뒷부분에서 다루도록 하겠습니다.

그림8. Diffuse reflection & Specuar reflection. 출처 : Diffuse reflection, Wikipedia.

어쨌든 기존 environment mapping 에서는 큐브맵을 specular 성분으로만 사용했습니다. 앞서 말했듯이 금속을 표현하기 위한 용도였죠. 하지만 이를 제대로 된 광원으로서 사용하기 위해서는 diffuse 성분도 고려되어야 하며, GI 까지 생각하면 그림9 처럼 주변광들까지 고려가 되어야 합니다. 주변광까지 고려해서 큐브맵으로부터 서피스에 들어 온 빛들은 서피스 입장에서 보면 조도( illuminance, irradiance )라 할 수 있겠죠. 그래서 이러한 정보를 담고 있는 것을 irradiance map 이라고 부릅니다.

그림9. IBL 에서 irradiance. 출처 : [3].

이 irradiance map 은 해당 지점에서 오는 난반사 성분을 받아야 하기 때문에 원래 이미지보다는 뭉개진 느낌이 나겠죠.  그림10 의 오른쪽에 보이는 큐브맵이 irradiance map 입니다.

그림10. Irradiance map 샘플. 출처 : [3].

그런데 여기에서 한 가지 문제가 발생합니다. 큐브맵 텍스쳐를 샘플링( 텍스쳐에서 텍셀( texel )값을 가지고 오고 필터링( filtering )하는 작업 )하는 것은 그렇게 비용이 싼 작업이 아닙니다. 게다가 그림9 에서처럼 매우 많은 영역을 샘플링해야 합니다. 그림9 에서는 예를 들기 위해서 화살표 몇개만 그려주고 2D 로 보여줬지만 3D 에서 엄청난 텍셀을 샘플링해야 합니다. 물론 하나만 할 수도 있겠지만, 그럼 주변광( indirect lighting )을 받는다는 GI 원칙에서 어긋나겠죠. [3] 에 따르면 한 면이 128 X 128 해상도인 큐브맵에서 diffuse 를 구하기 위해서는 50,000 만큼의 샘플링이 필요하다고 하네요.

그래서 연구자들은 이를 좀 단순하게 계산하는 방법을 찾았습니다. 그것이 바로 Spherical Harmonics( SH, 구면 조화 )입니다. 이름부터 무시무시합니다. 어디선가 한번씩은 들어 보셨을 거라 생각합니다. 이 주제에 대해서는 저도 완전히 파악하고 있지 않기 때문에 나중에 시간이 나면 자세히 다루도록 하겠습니다.

SH 는 구면에서 뭔가 튀어나오거나 들어 간 물체의 형태를 그림11 처럼 수학적으로 표현하는 것입니다. 그런데 계수( l )가 얼마나 크냐에 따라서 좀더 디테일한 모양이 나오는 것이죠. 이 함수에다가 각도같은 걸 넣으면 원하는 형태를 얻을 수 있습니다. 솔직히 이해하기 힘드니 "그냥 그렇구나" 하시면 됩니다.

그림11. Spherical Harmonics 예제. 출처 : Opinions on Spherical harmonics.

그런데 이걸 어디다 쓰느냐구요?

예를 들어 그림10 의 irradiance map 을 구에다가 매핑한 다음에 밝기에 따라 튀어 나오게 하면 그림12 같은 느낌이 되겠죠(그냥 개념적으로 쉬운 설명을 위한 용도로 만들었으므로 정확한 것은 아닙니다 ).

그림12. 그림10 의 irradiance 를 구에 매핑했을 때의 느낌.

그럼 이 모양에 SH 를 적용해서 단순한 함수로 만듭니다. 그림11 에서 봤듯이 어떤 계수를 사용하느냐에 따라 좀 더 많은 모양이 나오고 결과가 정확해지겠죠. 대체적으로 "l = 3" 정도면 그럴싸한 모양이 나온다고 합니다.

어쨌든 이런 식으로 각 텍셀을 SH 함수로 만들면 빛이 나가는 경향과 세기가 결정됩니다. 아티스트 분들은 그냥 "최적화 함수구나" 라고 이해하시면 됩니다. 우리가 사용하는 irradiance map 은 단순히 diffuse 를 저장한 것이 아니라 SH 를 저장한 것이라는 것만 알고 계시면 됩니다.

이러한 IBL diffuse 를 적용하면 그림13 과 같은 결과가 나옵니다.

그림13. IBL Indirect Diffuse. 출처 : [3].

IBL Specular

Specular 성분은 Environment Mapping 에서 다뤘던 것과 큰 차이는 없습니다. 하지만 PBR 에서는 roughness( 거칠기 ) 라는 개념을 도입했고, 같은 금속이라도 얼마나 연마되었느냐에 따라서 그림14 에서 볼 수 있듯이 매끈함의 정도가 틀립니다( roughness 에 대해서는 시리즈의 뒤쪽에서 설명하겠습니다 ).

그림14. Roughness 에 따른 매끈함의 변화.

일반적으로 거칠기에 의해 blurring 이 먹는 것을 표현하기 위해 그림15 처럼 mipmap 을 만들어 처리합니다. LOD 레벨이 높아질수록 Roughness 가 높은 것으로 취급합니다.

그림15. 반사맵 밉맵. 출처 : [3].

Roughness 0.1 일 경우에 specular 만 출력한 예가 그림16 에 나와 있습니다.

그림16. Roughness 01 에서 IBL Indirect specular 의 예. 출처 : [3].

정리

IBL 은 이미지를 광원으로 취급해서 indirect light 성분을 획득하는 방식입니다. 실시간 GI 를 구현하기 힘든 상황에서 대안으로 사용합니다. 사실, 실시간 GI 를 사용한다고 해도 모든 광원을 배치하는 것은 불가능하기 때문에, 같이 사용하는 경향이 있습니다.

실제 엔진에서는 importance sampling 이라든가 하는 복잡한 방식을 사용합니다. 왜냐하면 diffuse 처럼 specular 로 일정 영역을 샘플링해야 제대로 된 결과가 나오기 때문입니다. 이 기법은 반사, Area light, Ray-tracing, 적분( integral ) 등의 주제와 관련이 있으므로 여기에서 설명하기에는 좀 주제가 무겁습니다. 그러므로 나중에 따로 주제를 잡아서 이야기하도록 하겠습니다( 만약 자세한 내용을 알고자 한다면, "IBL Importance Sampling" 이나 "IBL Filtered Importance Sampling" 등의 키워드로 검색해 보십시오.

UE4 의 경우에는 Split Sum Approximation 과 Prefiltered Environment Map 이라는 기법을 사용해 IBL specular 를 구현한다는 것만 언급하고 넘어가겠습니다. 자세한 내용은 [ Real Shading in Unreal Engine 4 ] 의 [ Image based lighting ] 항목을 참조하세요 ).

참고자료

[1] The Story of Reflection Mapping.

[2] HDRI and Image-Based Lighting, SIGGRAPH 2003.

[3] Physcally Based Rendering - Part Three.

+ Recent posts