주의 : 공부하면서 정리한 것이므로 잘못된 내용이 포함되어 있을 수 있습니다.


개요



UE4, Unity 5, Frostbite, CryEngine 등과 같은 유명한 상용엔진들로 만든 게임들은 이제 기본적으로 PBR( Physically-Based Rendering )을 택하고 있습니다. 많은 AAA 급 타이틀들이 PBR 의 우수함을 증명했습니다. 우리나라야 이제 게임 기술 후진국이 되어 가고 있기 때문에( 주관적 판단임 ) 인기가 시들하고 개념을 모르는 사람도 많지만, 카더라 통신에 의하면 중국마저도 다들 PBR 에 꽂혀 가고 있다고 하더군요.


아티스트가 PBR 을 처음 접하면 매우 어렵습니다. 일종의 라이팅 패러다임의 변화이기 때문입니다. 그러나 조금 익숙해지면 기존의 라이팅 모델들보다 훨씬 적은 매개변수만을 사용해 라이팅을 제어할 수 있어서 PBR 을 선호하게 됩니다. 그리고 라이팅 환경이 바뀌어도 일관된 결과를 보여 준다는 점에서 매우 매력적입니다.


하지만 프로그래머에게 있어서는 지옥의 시작입니다. 모르는 단어들도 수두룩하게 나오는 데다가, 비용도 비싸기 때문에 최적화에 어려움을 겪게 됩니다. 게다가 자료도 그리 많지 않은 편입니다. 구글링을 해 보시면 알겠지만, PBR 구현에 대해 명료하게 다루는 글들이 많지 않습니다. 특히 PBR 구현에 있어 대세인 Cook-Torrance 에서 사용하는 GGX 라는 것은 검색해도 개념을 설명하는 글들을 찾기 힘듭니다. 


그래서 이 문서에서는 GGX 라는 것이 어떻게 나오게 된 것인지 가이드를 제공하고자 합니다. GGX 에 대해서 파고 들어 설명하는 글은 아닙니다. 이것을 이해하기 위해서 봐야 될 문서를 정리했다고 생각하시면 됩니다( 제가 실무를 통해 직접 구현해 본 것이 아니기 때문에 이해도가 낮습니다 ).


Cook-Torrance



참고 자료 : Cook-Torrance

참고 자료 : Specular BRDF Reference


우리가 기존에 다루었던 라이팅 모델들은 대부분 어느 정도는 미세면( microfacet )에 대해서 고려하고 있습니다. 이 표면의 거칠기를 어떻게 근사계산하느냐에 따라서 여러 가지 모델들이 나뉘게 됩니다. 이 거칠기에 의해서 reflectance model 이 결정되는데요, 아마 PBR 을 검색해서 이 문서를 찾으실 정도의 분들이라면 BRDF( Bidirectional Reflectance Distribution Function )의 개념에 대해서는 이해하고 계실 것이라고 가정합니다. 


만약 BRDF 가 뭔지 모르겠다는 분들이 있다면 그것부터 공부하고 오시는 것이 좋을 것이라 생각합니다. 그렇지 않다면 이 문서를 더 봐도 무슨 말을 하는지 이해하기 어려울 수 있습니다. 어쨌든 미세면 개념은 매우 중요합니다. 그리고 이와 관련한 많은 쉐이딩 이론이 존재합니다. 하지만 여기에서는 Cook-Torrance 모델에 대해서만 다루도록 하겠습니다.


Cook-Torrance 는 Robert L. Cook 과 Kenneth E. Torrance 에 의해 개발된 라이팅 이론입니다. 이는 Phong 이나 Blinn-Phong 보다는 좀 더 물리적인 현실감을 제공합니다. 이 모델은 오브젝트의 표면이 매우 많은 미세면에 의해 구성되어 있다고 가정합니다. 이 미세면들은 개별적으로 들어 오는 빛을 반사하게 되는데요, 이것이 거치냐 매끄럽냐에 따라서 반사하는 패턴이 달라지게 된다는 것입니다. 물론 실제로 그것을 다 계산해 주면 좋겠지만, 컴퓨팅 파워 및 메모리의 부족으로 인해 분산함수를 사용하게 됩니다.


Cook-Torrance 에서는 대부분의 쉐이딩 모델과 마찬가지로 ambient, diffuse reflection, specular reflection 항을 사용합니다. 그 중 diffuse reflection 을 위해서는 Lambert reflection( N dot L )을 사용합니다. 대부분의 계산은 specular reflection 에 초점을 맞추고 있습니다. 이 모델의 최종 공식은 다음과 같습니다.



여기에서 k 는 diffuse 계수입니다. ( 1 - k ) 가 들어 가는 것은 에너지 보존을 위해서입니다. 그리고 rs 는 specular 항입니다.


이 specular 항은 다음과 같이 계산됩니다.



F 는 Fresnel 항이고, D 는 Distribution 항이고, G 는 Geometric shadow( Geometric attenuation ) 항입니다. 각 항에 대한 자세한 설명은 [ Cook-Torrance ]에서 확인하시기 바랍니다. 


이제 각 항에다가 어떤 공식을 넣느냐에 따라서 변종이 발생합니다. 그 변종들의 공식에 대해서는 [ Specular BRDF Reference ] 라는 기사에 잘 정리되어 있습니다. 이 중에 요새 GGX 가 대세라 하더군요. 


GGX?



참고 자료 : Microfacet Models for Refraction through Rough Surfaces


GGX 라는 것은 [ Microfacet Models for Refraction through Rough Surfaces ] 에서 처음 소개된 것으로 보입니다( 번역 : http://lifeisforu.tistory.com/352 ). 이 논문의 저자로 Kenneth E. Torrance 가 포함되어 있네요.


We also introduce a new microfacet distribution, which we call GGX, that provides a closer match for some of our surfaces than the standard Beckmann distribution function.


출처 : Microfacet Models for Refraction through Rough Surfaces


 

말 그대로 이 논문에서 새로운 미세면 분산 함수인 GGX 를 소개했습니다. 그런데 이 문서에서도 "GGX 가 뭐의 약자이다" 라는 식의 이야기는 없습니다. 그냥 제가 추측하기로는 shadow visibility 를 구할 때 G1 을 두 번 곱하게 되는데, 그래서 GG 가 아닐까 싶네요. X 는 eXtended multiply 정도의 느낌이랄까... 이것에 대해 정확하게 아시는 분이 있다면 댓글 달아 주시면 좋겠습니다.


수정: 댓글달아 주신 3D 님의 "Ground Glass Unknown" 을 힌트로 검색을 해 봤는데, 이게 GGX 가 맞더군요. http://jcgt.org/published/0007/04/01/paper.pdf


어쨌든 이 GGX 에 대한 완벽한 이해를 원하신다면 해당 문서를 보시는 것이 좋을 것 같습니다.


그리고 GGX 최적화를 위해서 [ Optimizing GGX Shaders with dot( L, H ) ] 라는 글도 참고해 보실만 할 것 같습니다. 수정 : 실제로 적용해 본 분에 의하면, instruction 수 차이도 별로 안 나고 오류가 있다고 하네요. 그래서 적용했다가 뺐다고 하는데, 자세한 내용은 기억이 안 난다고 합니다. 수정2 : 다른 분이 이 방식의 옵티마이즈를 해 보고 반론을 주셨습니다. 아래 카톡 대화를 참조하세요.

 

 

또한 [ Adopting a Physically-based Microfacet BRDF model in Three.JS ] 라는 글도 읽어 보시면 도움이 될 것 같습니다. 링크의 페이지에서는, 웹에서 PBR 을 구현하면서 만나게 된 여러 가지 이슈들에 대해 정리해 놓았습니다.


추가: UE4 문서 같은데 보면 lighting model 은 light-source 를 모델링하는 것을 의미하더군요. 예를 들어 area light 를 위해 billboard-reflections, cone-intersection, representive-point, sphere-lights, tube-lights 등의 모델을 사용할 수 있습니다( http://lifeisforu.tistory.com/348 의 lighting model 항목을 참조하세요 ).

+ Recent posts