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

주의 : 여기에서 Specular BRDF 공식에 대해서는 자세하게 다루지 않을 계획입니다. 공부를 더 하고 싶은 분들은 참고자료들을 확인하세요.


[ PBR 이란 무엇인가 ] 20. Specular BRDF

19. Diffuse BRDF ] 에서 Diffuse 를 위해서는 일괄적으로 Lambert cosine law 를 사용한다고 했습니다. 그렇기 때문에 금속이 아니라면 Diffuse 는 모든 재질에 대해서 동일하게 적용된다고 보면 됩니다.

Disney 의 Burley 같은 경우에는 새로운 diffuse model 을 만들었습니다. 그러나 그것은 그림1 처럼 외형상 큰 차이를 보여주지 못하고 계산 비용만 더 들기 때문에 실시간 그래픽스에서 잘 사용되지 않습니다.

그림1. Lambert 모델과 Burley 모델의 비교. 큰 차이를 보이지는 않음. 출처 : [ 1 ].

하지만 Specular 의 경우는 다릅니다. 물체가 어떤 재질로 구성되어 있느냐에 따라 달라집니다( 물론 Diffuse 도 그래야 하지만 대충 넘어갑시다. 두 마리 토끼를 잡기는 쉽지가 않으니... ). Specular 는 물체의 재질특성을 보여주는 매우 중요한 요소입니다. 그러므로 여러분이 한 번이라도 들어 본 대부분의 BRDF 모델들은 거의 다 specular 와 관련된 것일 겁니다. 그렇기 때문에 조금 비용을 들이더라도 재질 차이를 확실하게 보여 줄 만한 모델을 사용하죠.

지금까지 우리는 PBR 의 대원칙들에 대해서 살펴 봤습니다. 처음에 글을 시작하면서 PBR 이라는 것은 다음과 같은 요소를 포함해야 한다고 했습니다.

    • 전역 조명( Global Illumination ) : 이미지 기반 라이팅( Image Based Lighting, IBL ).
    • 에너지 보존 법칙( Energy Conservation ).
    • 반사도( Reflectivity ) : 디퓨즈 및 스펙큘러( Diffuse & Specular ).
    • 미세면( Microsurface ) : 러프니스( Roughness ).
    • 프레넬 법칙( Fresnel's Law ).
    • 금속성( Metalicity ).

[ 1. 인간과 빛 ], [ 2. 조도와 휘도 ], [ 3. 빛의 감쇠 ], [ 4. 광원의 밝기( 광속 ) ], [ 5. 조도( illuminance ) 측정 ], [ 6. 휘도( luminance ) 측정 ] 에서는 빛의 기본 성질에 대해서 중점적으로 이야기했습니다.

[ 7. Light Intensity 설정 ], [ 8. Attenuation Radius 설정 ] 에서는 에너지 보존 법칙에 대해서 중점적으로 이야기했습니다.

[ 9. Global Illumination & Indirect Lighting ], [ 10. Image Based Lighting ], [ 11. UE4 GI : Sky Light ], [ 12. UE4 GI : Reflection Capture ], [ 13. UE4 GI : Lightmass & Mobility ] 에서는 전역 조명에 대해서 중점적으로 이야기했습니다.

[ 14. 모든 것은 빛납니다 ], [ 15. 모든 것은 프레넬을 가집니다 ], [ 17. Fresnel 이란 ] 에서는 프레넬 법칙에 대해서 중점적으로 이야기했습니다.

[ 실제 이미지에서 specular 와 Diffuse 분리하기 ], [ 16. Reflection 에 대한 잘못된 상식들 ], [ 18. Distribution Function ] 에서는 반사도와 Diffuse  및 specular 개념에 대해서 중점적으로 이야기했습니다.

[ 19. Diffuse BRDF ] 에서는 Diffuse BRDF 에 대해서 중점적으로 이야기했습니다.

마지막으로 이번 챕터에서는 미세면과 금속성에 대해서 다루게 됩니다. 아무런 순서도 없이 두서없이 글을 진행한 것처럼 보였을지 모르겠지만 나름대로 생각하고 진행했답니다.

이제 PBR 에서의 specular BRDF 에 대해 중점적으로 살펴 보도록 하겠습니다.

MERL 100

Diffuse 및 Specular 모델을 만들 때 그냥 내키는 대로 만드는 것은 아닙니다. 어떤 기준이 있어야 하며 실제로 측정된 BRDF 모델을 사용하는 경우가 많습니다. 그 중 하나가 MERL 100 이라는 것이죠.

그림2. MERL 100. 출처 : [ 2 ].

이것은 100 개의 등방성 재질을 캡쳐한 것으로 페인트, 나무, 금속, 섬유, 돌, 플라스틱, 그리고 다른 합성 재질들을 포함합니다. 이것은 새로운 BRDF 모델들이 나오면 그것의 결과가 얼마나 맞는지 확인하기 위해서 사용됩니다. 자세한 내용에 대해서 알고자 한다면 [ 2 ] 를 확인하시기 바랍니다.

이 MERL 100 을 반드시 이해하실 필요는 없습니다. 지금 우리가 다루고 있는 영역이 매우 물리적인 측정값에 기반하고 있다는 것을 강조하기 위해서 언급했을 뿐입니다.

미세면 분포 함수 : D 함수

미세면( Microfacet ) 모델이라는 것은 폴리곤의 거대면( Mcrosurface )은 그림3 처럼 미세면으로 구성되어 있다는 전제에서 반사나 굴절을 모델링하는 것을 의미합니다.

그림3. Microsurface vs Macrosurface. 출처 : [ 4 ].

여러분은 반짝반짝 빛나는 면들은 매끈하고 빛나지 않는 면들은 거칠다는 것을 경험적으로 알고 계실 겁니다. 물론 코팅을 해 놓아서 빛날 수도 있지만 그 부분은 예외로 두고 이야기하도록 하겠습니다.

하지만 이러한 미세면의 분포는 재질마다 다를 겁니다. 그것을 Albedo 설정하듯이 아티스트가 일일이 설정할 수는 없겠죠. 게다가 미세면이라는 것은 거의 눈에 보이지도 않는 면을 이야기합니다. 

그러므로 몇 가지 매개변수만으로 분포를 계산할 수 있는 함수가 필요하겠죠? 그것이 바로 미세면 분포 함수입니다. Distribution 의 머리글자를 사용해 이 함수를 D 라고 부릅니다. 일반적으로 이 D 함수는 통계적인 기법을 이용하게 됩니다. 여기에서 세부 사항에 대해서 구체적으로 다루지는 않겠습니다. 더 구체적으로 알고 싶은 분들은 참고자료를 확인하세요.

어쨌든 이 D 함수는 Specular Peak 가 어느 방향을 향하게 되는지를 결정하게 됩니다. 우리는 Specular 를 거울면 반사라고 생각하고 있지만, 사실은 입사각과 반사각이 정확하지는 않습니다. 이는 표면의 거칠기( 미세면의 분포 )에 영향을 받게 되죠. 거울면 반사에서 벗어나서 생기는 반사를 "Off-specular reflection" 이라고 부릅니다. 우리 말로 굳이 해석하자면 "거울면 반사( 정반사 )를 벗어난 반사"라고 할 수 있겠습니다.  

그림4 는 서로 다른 미세면 분포를 가진 표면에서 이 off-specular reflection 이 어떻게 달라지는 지 보여 줍니다.

그림4. Off-specular reflection 의 예: 지표각에 가까워질 수록 specular 의 방향( M ) 이 반사각과 달라지는 모습을 보여줌.

D 함수는 거대면 내에서 우리에게 거울면 반사를 보여줄 수 있는 미세면의 양이 얼마나 되는지를 알려주는 것입니다( 여기에 대해서 제가 이해한 바를 정리해 봤는데, 자세히 알고 싶으신 분들은 [ PBR Specular D 의 기하학적 의미 ] 를 참고하세요 ).

미세면 그림자 마스킹 함수 : G 함수

자, 여러분은 렌더링할 때 그림자가 없으면 매우 어색하다는 것을 알수 있습니다. 미세면의 그림자의 경우에는 그 정도 영향력을 가지지는 않습니다. 눈에 거의 보이지도 않는데 알게 뭡니까.

그림5. 그림자 마스킹의 기하학. 같은 미세면 노멀 m 을 사용하는 세 지점을 비교.

두 개는 io 방향에서 보이며, 한 개는 i 방향에서 차폐됨.

하지만! 에너지 보존 법칙을 위해서는 반드시 고려되어야 합니다. 그런데 미세면 그림자 마스킹도 아티스트가 작업할 수 있을만한 건 아니겠죠. 그래서 이것도 함수로 만듭니다. 기하와 관련된 것이므로 Geometry 의 머리글자를 사용해 G 함수라고 부릅니다. 

프레넬 함수 : F 함수

모든 물체의 반사에는 프레넬 법칙이 적용된다고 했습니다. 그러므로 당연히 이것과 관련한 함수도 있겠죠? Fresnel 의 머리글자를 사용해 F 함수라고 부릅니다. 프레넬이 뭔지 기억이 가물가물한 분들은 [ 17. Fresnel 이란 ] 을 참고하세요.

금속일수록 거의 거의 대부분의 각도에서 높은 반사율을 보이며, 비금속일수록 지표각에서 높은 반사율을 가집니다.

모아봅시다

자 위에서 언급한 세 개의 함수를 모아 봅시다. 어떤 빛이 표면에 들어 오면 미세면 분포 함수 D 에 의해서 off-specular reflection 이 결정될 것이고, 기하학적 감쇠 G 함수에 의해 에너지 보존 법칙이 적용됩니다. 그리고 프레넬 함수 F 에 의해 반사율이 결정됩니다.

눈치가 빠른 분들은 DG 가 표면의 거칠기( roughness )와 관련이 있고 F 가 금속성( metallicty )과 관련이 있음을 알 수 있을 겁니다. 이걸 제대로 표현하기 위해서는 매우 많은 공식이 필요하지만 여기에서는 구체적으로 언급하지 않겠습니다. 참고자료를 확인하시기 바랍니다.

그러므로 미세면과 프레넬을 고려한 Specular BRDF 는 기본적으로 식1 과 같은 형태를 띄고 있습니다. 우리가 위에서 언급하지 않은 것들이 분모에 들어 가 있지만 별로 신경쓰실 것은 없습니다. 빛과 표면의 관계 및 에너지 보존을 위해 들어 가 있습니다 :

식1. Specular BRDF.

식1 은 Cook-Torrance 의 BRDF 모델이며, D, F, G 를 위해 어떤 알고리즘을 사용하느냐에 따라 결과가 조금씩 달라집니다. UE4 의 경우에는 D 를 위해 GGX 를, G 를 위해 Smith Approximation 을, F 를 위해 Shilick's approximation 을 사용합니다. 여러 가지 변종들에 대해서 궁금하다면, Graphic Rants 블로그의 [ Specular BRDF Reference ] 를 참조하세요.

여기에서 식을 언급하기는 했지만 굳이 이해하실 필요는 없습니다. 위에서 언급했듯이 roughness 값은 DG 에 영향을 주고, metallic 값은 F 에 영향을 준다는 것만 알고 계시면 됩니다.

Roughness 는 반사의 선명도 및 확산과 관련이 있으며, metallic 은 반사의 세기 및 각도와 관련이 있습니다.

UE4 에서 Metallic

UE4 에서의 Metallic 에 대해서 이야기해 보도록 하겠습니다. 이것은 프레넬과 관련이 있다고 했습니다. 정확하게 말하자면 F0 값입니다. 굴절률( Index Of Refraction, IOR ) 값으로부터 결정됩니다. 이에 대해서는 [ 17. Fresnel 이란 ] 에 자세히 언급했으니 기억이 안 나면 참고하세요. 앞의 링크에는 IOR 을 F0 로 변경하는 공식과 IOR 정보를 알 수 있는 사이트에 대한 링크가 있습니다.

그림6. 프레넬 공식 그래프. 출처 : Real-Time Rendering, 3rd Edition.

금속들은 수직으로 내려다 봤을 때( 즉 0 도일 때 ) 0.5 이상의 F0 값을 가지고 있으며, 보석같은 경우에는 0.2 이하의 F0 의 값을 가지고 있으며, 우리가 자연에서 볼 수 있는 많은 물체들은 0.05 이하의 값을 가지고 있습니다.

낮은 F0 값을 가질 수록 지표각에 가까워져야 반사가 제대로 보입니다. 이 F0 값이 Metallic 값으로 사용됩니다. 즉 높은 metallic 값을 가진다면 아무데서나 봐도 반사가 잘 보이고, 낮은 metallic 값을 가진다면 지표각에 가까워야 반사가 잘 보인다는 의미입니다.

이것의 활용법에 대해서는 아래에서 자세히 다루도록 하겠습니다.

UE4 의 SpecularColor

그런데 여기에서 하나 알고 넘어 가야 할 것이 있습니다. UE4 에서의 SpecularColor 의 개념입니다. 원래 SpecularColor 라는 것은 재질의 색상이 아니라 빛의 색상을 의미해야만 합니다. 하지만 완벽하게 Metallic 이 0 이거나 1 인 경우는 거의 없기 때문에 이 색상이 섞이게 됩니다. 그리고 전에 말씀드렸듯이 금속은 모든 빛을 흡수해서 방출하기 때문에 Diffuse 가 존재하지 않고 Specular 는 금속 특유의 색상이 나오게 됩니다. 그런데 SpecularColor 핀을 추가하는 것은 ( 성능 및 메모리에 ) 부담이 되므로 BaseColor 를 마치 금속 특유의 방출 색상인 것처럼 사용하게 됩니다.

이를 위해 UE4 는 다음과 같이 SpecularColor 와 DiffuseColor 를 적용합니다.

SpecularColor = lerp( 0.08 * Specular.xxx, BaseColor, Metallic.xxx ); 

공식이 어려워 보이겠지만 잘 생각해 보면 그렇게 어렵지는 않습니다. 먼저 SpecularColor 를 결정하는 공식을 보죠. lerp( x, y, z ) 는 x 와 y 값을 z 값으로 선형보간합니다. 알파블렌딩과 유사하다고 보시면 됩니다. z 가 0 이면 x 값이 1 이면 y 값이 나오는 것이죠.

만약 완전한 금속( Metallic = 1 )이라면 BaseColor 를 사용하고, 완전한 비금속( Metallic = 0 )이라면 0.08 * SpecularColor.xxx 를 사용합니다. 여기에서 xxx 라는 것은 rgb 각 채널에 한 값을 반복해서 넣겠다는 의미입니다. 즉 값이 vector 가 아니라 scalar 라는 의미죠. 저 SpecularColor 라는 것은 material node 에 존재하는 "Specular" 핀을 의미합니다.

그림7. Material Specular 핀.

어떤 분들은 여기에다가 Color 를 넣는 경우가 있는데, 핀 이름이 "Specular Color" 가 아니라 "Specular" 인 이유가 있습니다. 이 경우에는 scalar 값이므로 Color 를 넣어도 의미가 없습니다. 만약 color 를 넣게 된다면 R 채널만을 사용하게 됩니다.

그림8. 잘못된 Specular 값 설정. 이 경우에는 R 채널값이 0.839 가 사용됨.

자 이제 다시 본론으로 돌아와서 Specular 값에 0.08 이 곱해져 있으므로 이건 상당히 미세한 값을 의미합니다. Specular 를 설정하지 않으면 기본값이 0.5 이므로 실제로는 0.04 의 값이죠. 다시 말해 Metallic 이 0 이어도 specular 가 0.4 정도의 비율로 반영된다는 의미입니다.

SpecularColor 값은 다음과 같이 결정됩니다.

 Metallic

 Equation

 Result

 0

 0.08 * Specular.xxx * ( 1 - 0 ) + BaseColor.xyz * ( 0 ) 

 0.08 * Specular.xxx

 0.3

 0.08 * Specular.xxx * ( 1 - 0.3 ) + BaseColor.xyz * 0.3

 0.056 * Specular.xxx + 0.3 * BaseColor.xyz

 0.6

 0.08 * Specular.xxx * ( 1 - 0.6 ) + BaseColor.xyz * 0.6

 0.032 * Specular.xxx + 0.6 * BaseColor.xyz

 1.0

 0.08 * Specular.xxx * ( 1 - 1 ) + BaseColor.xyz * 1

 BaseColor.xyz

BaseColor 는 RGB 채널을 모두 쓰고 SpecularColor 는 scalar( 즉 회색 ) 입니다. 그래서 Metallic 이 1 에 가까워지면 SpecularColor 의 색상에 BaseColor 가 많이 묻어 나오고, 0 에 가까워지면 BaseColor 의 색상이 덜 묻어 나옵니다. BaseColor 의 색상이 덜 묻어 나온다는 것은 순수한 라이트의 색상에 가깝다는 의미죠. 대신 SpecularColor 에 0.08 이 곱해져 있으므로 specular higthlight 가 약해집니다.

그림9. Metallic 에 따른 specular color. Diffuse 를 off 시킴.

광원이 흰색이라 차이가 잘 안 드러나죠? 보라색 광원을 하나 배치해 보겠습니다.

그림10. 색상이 있는 광원을 추가했을 때의 결과. 순서는 그림 9와 같음. Diffuse 를 off 시킴.

그림10 을 보면 metallic 이 낮을수록 원래 광원의 색상이 더 반영된다는 것을 확실히 알 수 있습니다.

그런데  비금속( metallic 이 0 이 아님 )인 경우에 specular 를 올리거나 내리고 싶은 경우가 있습니다. 이럴때 바로 "Specular" 핀을 사용하는 것입니다. 그러면 그림11 과 같은 결과가 나옵니다.

그림11. Metallic = 0 일때 Specular 설정 결과 비교. Diffuse 를 off 시킴.

만약 비금속재질에서 반사에 라이트 색상을 보존하고 싶으시다면 SpecularColor 를 구하는 공식을 프로그래머에게 변경해 달라고 요청하시면 됩니다.

UE4 의 Roughness

아마 roughness 는 ( 눈으로 보기에 ) 가장 이해하기 쉬운 개념일 것입니다. 물론 내부적으로는 DG 를 위해서도 사용되기는 하지만 별로 신경을 쓸 필요는 없겠죠.

그냥 아티스트 입장에서는 "거칠면 반사가 뭉개지고 안 거칠면 반사가 또렷해진다" 정도로 이해하면 그만이겠습니다.


그림12. Metallic 이 0.5 일때 Roughness 변화에 의한 결과. Diffuse 를 off 시킴.

에너지 보존 법칙

위에서 specular G 에 대해 언급하면서 에너지 보존 법칙을 이야기했습니다. 하지만 여기에서는 Diffuse 와 Specular 의 관계에 있어서 에너지 보존 법칙을 이야기하고자 합니다.

표면에 들어 온 빛은 일부는 흡수되고, 일부는 반사되고, 일부는 투과됩니다. 이 반사되는 빛은 Diffuse 와 Specular 로 나뉜다는 것은 익히 알고들 계실 겁니다. 그런데 문제는 Diffuse 와 Specular 가 어느 비율로 반사되느냐입니다. 예전 Phong 과 같은 모델에서는 그냥 아티스트가 임의로 설정하게 했습니다. Kd 나 Ks 같은 항이 있었죠. 아티스트가 원하는 결과를 만들려고 하다 보니 과도한 라이팅이 들어 가는 경우가 많았습니다.

사실 조명에 대한 이해가 높지 않으면 적정 값을 설정하기 힘들죠. 그것도 한씬이 아니라 다양한 라이팅 환경이 존재하는 씬에서 맞추는 것은 쉽지가 않은 일입니다.

그림13. 에너지 보존 적용하지 않은 경우. 가장 왼쪽은 과도하게 빛나고 가장 오른쪽은 선명하지 않음. 출처 : Energy Conservation In Game.

그림14. 에너지 보존 법칙이 적용된 경우. 출처 : Energy Conservation In Game.

하지만 PBR 에서는 들어 온 빛의 양보다 나가는 빛의 양이 많아서는 안 됩니다. 그러므로 흡수되거나 투과되는 빛이 없다고 가정할 때 Diffuse + Specular 의 양은 항상 들어 온 빛의 양과 같아야만 하죠. 그래서 UE4 에서는 Metallic 을 가지고 Diffuse 의 양을 조절합니다.

DiffuseColor = BaseColor - BaseColor * Metallic;

Metallic 이 세지면 specular 가 세진다는 의미이고 Diffuse 의 양이 줄어들게 됩니다. 위에서 SpecularColor 를 구할 때 lerp 의 파라미터로 Metallic.xxx 를 넘기고 있기 때문에 Metallic 이 크면 Specular 가 늘어나고 Metallic 이 작으면 Diffuse 가 늘어나는 결과를 내게 되는 것입니다.

이것은 기존의 non-PBR 환경의 작업자들에게는 좀 어색하게 느껴질 수 있습니다만, 물리적으로 올바른 결과이고 라이팅 환경이 달라도 어색함이 적어집니다. 게다가 그 비율을 아티스트가 신경쓰지 않아도 되니 금상첨화입니다.

결론

Specular BRDF 공식은 매우 복잡하지만, 아티스트 입장에서는 metallic 과 roughness 만 알면 대충 재질을 설정할 수 있습니다. 그리고 그 재질들을 위한 물리적 값은 이미 정해져 있고 그것을 데이터베이스로 만드는 것이 아티스트나 팀의 역량이 되겠죠.

막말로 metallic 같은 경우에는 비금속은 0 금속은 1 이라고 설정해도 문제될 것은 없습니다. 대부분 roughness 가 중요한 factor 가 됩니다. 그러므로 특이한 경우( 매우 정교하게 섞인 복합재질 )가 아니라면 metallic 을 위해서 큰 리소스를 할당할 이유가 없습니다. 맵이 거의 단색으로 나온다고 해도 과언이 아닙니다. 만약 맵을 따로 만든다면 metallic 과 관련한 맵만 작게 만드는 것도 최적화를 위해 좋을 것입니다.

시리즈를 마무리하며...

Specular BRDF 는 [ PBR 이란 무엇인가 ] 시리즈에서 이야기하고자 하는 최종 보스라 할 수 있습니다. 이제 외전격의 이야기 몇 개만 제외하면 실질적으로 마지막 글이라고 생각하셔도 무방합니다. 이제 대단원( ? )의 막을 내리게 되겠네요. 제대로 이야기를 못 풀어 나간 것 같아서 아쉽기도 하지만, 이제 저작의 고통에서 벗어날 수 있다는 생각에 시원하기도 하네요. 이런 걸 시원섭섭하다고 하죠 ㅋ.

아티스트도 쉽게 이해할 만한 내용을 쓰고 싶었는데 많은 내용을 담으려고 욕심을 내다가 보니 밸런스를 잘 못 맞춘 것 같아서 아쉽네요. 아티스트도 만족을 못하고 프로그래머나 TA 도 만족을 못하는 그런 글이 되지 않았나하고 자평을 해 봅니다.

다음에 기회가 되면 보충글을 더 올리도록 하겠습니다. 지금까지 긴 시리즈를 읽어 주셔서 감사합니다.

추가 : [ 21. PBR 셰이더 구성 ].

참고자료

[ 1 ] Real Shading in Unreal Engine 4, Biran Karis.

[ 2 ] A Reflectance Model for Computer Graphics, Robert L. Cook and Kenneth E. Torrance.

[ 3 ] Physically-Based Shading at Disney, Brent Burley.

[ 4 ] Microfacet Models for Refraction through Rough Surfaces, Bruce Walter, Stephen R. Marschner, Hongsong Li, Kenneth E. Torrance,.


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


[ PBR 이란 무엇인가 ] 19. BRDF

오늘은 BRDF 에 대해서 이야기해 보려 합니다. BRDF 는 "Bidirectional Reflectance Distribution Function" 의 머리글자입니다. 우리 말로는 "양방향 반사율 분포 함수"입니다. 이 BRDF 는 Diffuse BRDF 와 Specular BRDF 로 나뉩니다. 한번에 모든 것을 설명할 수 있는 모델이 있으면 좋겠지만, 안타깝게도 현재까지는 ( 필자가 알기로는 ) 상용화된 모델이 존재하지 않습니다.

어쨌든 BRDF 는 그림1 의 파라미터들을 사용해 식1 과 같은 형태의 함수 fr 로 정의됩니다[ 1 ] :

식1. BRDF 함수 형태. 출처 : [ 2 ].

 

그림1. BRDF 함수를 정의하는 다이어그램. 출처 : [ 2 ].

식이 나오니 뭔가 어렵게 느껴지실 수도 있지만 규칙을 알면 어려울 것이 없습니다.

식1 에서 r 이라는 아래첨자( subscrip )는 reflectance 의 머리글자입니다. 함수가 r 에 대한 함수라는 의미죠. ω( 오메가 ) 라는 파라미터( 매개변수, parameter )는 함수의 입력값을 의미하죠. 여기에서는 i 라는 아래첨자는 incident( 입사하는 ) 의 머리글자입니다. 즉 ωi 는 입사광 벡터( 광원을 향하는 벡터 )을 의미하고 ωr 은 반사광 벡터( 관찰자를 향하는 벡터 )를 의미합니다.

자, 정리해 봅시다. 함수 f 는 입사 방향과 반사 방향을 입력으로 받으면, 그 관계에 따라 반사율( 입사광과 반사광의 비율 = 반사광 / 입사광 )을 출력으로 내뱉어 준다는 것입니다.

여기에서 f 는 실제 식을 가지고 있지 않습니다. 형태만을 정의한 것이죠. 다시 말해 다음과 같은 조건을 만족하면 BRDF 라 할 수 있는 것입니다.

    • 반사율 분포( Reflectance Distribution )를 출력으로 내뱉음.
    • 양방향성( Bidirectional )을 가짐: 광원과 관찰자의 관계가 동일하다면 반사율 분포가 변하지 않음.
    • 광원과 관찰자를 입력 파라미터로 받음.
    • 함수( Function )여야 함: 같은 입력에는 항상 하나의 같은 결과가 나와야 함.

그렇다면 여러분은 위의 조건을 만족하기만 하면 구현하는 사람마다 다른 결과를 낼 수 있을 것이라는 사실을 유추하실 수 있을 겁니다. 그래서 BRDF 모델은 참 다양합니다( 그림2 참조 ).

그림2. 다양한 BRDF 모델들. 출처 : [ 1 ].

우리가 많이 들어 본 Cook-Torrance, Oren-Nayar, Phong, Blinn 등 여러 가지 BRDF 모델들이 있군요. Theroical( 이론적인 ) 은 이론적으로는 더 올바른 결과를 내는 모델들을 의미하고, Empirical( 경험적인 ) 은 덜 이론적이지만 실증된 결과를 반영한 것을 의미합니다. 마지막으로 Experimental( 실험적인 ) 은 말 그대로 실험적인 결과를 보여 줍니다. 살색은 결과가 Isotropic( 등방성 ) 이라는 것이고 녹색은 결과가 Anisotropic( 비등방성 ) 이라는 것입니다.

Diffuse BRDF

일반적으로 Diffuse BRDF 는 Lambertian reflectance( 램버트 반사율 ) 를 사용합니다. 복잡한 모델들도 있을 수 있겠지만 diffuse 모델의 경우에는 별 차이가 나지 않습니다.

램버트 반사율은 표면이 이상적인 확산 반사를 보여준다고 가정합니다. 소위 "무광( matte )" 재질을 의미합니다. 모든 방향으로 균일하게 빛을 반사하고 있다는 것이죠.

전에 [ 16. Reflection 에 대한 잘못된 상식들 ] 에서 언급했듯이 diffuse 는 표면에 흡수된 후에 다시 방출되는 것이라서 재질의 색상을 보여 준다고 했습니다.

그림6. Diffuse 의 발생과정. 출처 : [ 4 ].

그런데 이게 어떻게 튈지는 구성요소의 성분과 밀도에 따라 달라지기에 한정된 자원을 가진 현세대 컴퓨터로 이를 제대로 표현하는 것은 힘듭니다. 그래서 전방향으로 균일하게 반사한다고 가정하는 것이 바로 램버트 반사율입니다( 그런 재질을 가졌다고 가정한 상태에서의 표면을 Lambertian surface 라고 부르기도 합니다 ).

하여간 이를 그림으로 표현하면 그림7 과 같습니다.

그림7. Lambertian reflectance. 붉은색이 diffuse. 출처 : [ 4 ].

그런데 글을 차분히 읽으신 분은 여기에서 강한 의문을 표하게 될 것입니다 : "모든 방향으로 균일하게 반사한대며?".

그렇다면 그림7 은 잘못된 것일까요? 그림8 이 맞는 걸까요?

그림8. Lambertian reflectance. 전방향으로 동일하게 반사. 출처 : Optical PTFE from Lake Photonics.

제가 "안 누구누구"는 아니지만 "그림7 일수도 있고 그림8 일수도 있습니다" 라고 대답하도록 하겠습니다.

빛은 그림8 처럼 표면에서 균일하게 반사되어 나가는 것이 맞습니다만, 표면에 들어 온 조도( 빛의 양 )가 다릅니다. [ 5. 조도( illuminance ) 측정 ] 에서 빛을 받는 서피스의 기울기에 따라서 빛을 받는 양이 달라진다고 했던 것이 기억나시나요? 표면에 도달한 빛은 그림8 처럼 모든 방향으로 균일하게 방출되지만, 눈으로 볼 때는 그림7 처럼 기울기에 따라 다른 양의 빛을 받게 되는 겁니다. 램버트 모델에서는 관찰자의 위치에 따라 반사율이 달라질 수는 없지만 조도가 다르기 때문에 기울기가 커지면 점점 어두워 보이게 되는 것입니다.

그림9. 기울기와 조도의 관계. 램버트 코사인 법칙. 출처 : Lambert's Cosine Law, Ocean Optics.

그림9 에서 박스가 눈의 면적만큼의 빛덩이라고 가정합시다. 기울기가 작아지면 같은 면적이라고 할지라도 더 적은 양의 빛이 들어 오게 되는 것을 알 수 있습니다. 이  이것을 수학적으로 정리한 사람이 Lambert 이고 그 결과가 cosine 법칙과 같기 때문에, 이를 램버트 코사인 법칙( lambertian cosine law )라고 부릅니다.

빛을 향하는 벡터와 표면의 노멀을 내적(  dot product )하면 그 결과는 cosine 과 같아집니다. 왜냐하면 N 과 L 은 정규화된( normalized ) 벡터이므로 그 길이가 1 이기 때문입니다.

식2. Diffuse BRDF. 램버트 코사인 법칙.

이것이 소위 말하는 "엔닷엘"입니다. 식2NL 중간에 있는 mid dot( · ) 연산자가 dot product( 내적 )을 의미합니다. N 은 표면의 노멀( Normal ) 벡터이고 L 은 라이트( Light ) 벡터입니다.

그런데 이 시점에서 민감하신 분들은 왜 식1 의 형식과 다르냐고 지적하실 수 있습니다. 여기에서는 ωi 를 입력값으로 받지 않죠. 왜냐하면 전술했듯이, 그림8 처럼 관찰자의 위치와 관계없이 모든 방향으로 균일하게 빛을 반사하기 때문에 관찰자의 위치는 필요하지 않습니다. ωi 를 입력값으로 넣는다고 해도 아무런 변화가 없다는 것입니다. N·L 은 조도계산을 위해서 필요한 것입니다. 

에너지 보존( Energy Conservation ) 법칙

아티스트들과 연구자들은 이 Diffuse BRDF 가 뭔가 이상하다는 것을 깨닫게 됩니다( 사실 물리적으로 올바르지 않으면 자연스럽지도 않습니다. 그것이 얼마나 많이 티가 나느냐는 차이가 있을 뿐이죠. 왜냐하면 우리 눈은 실세계에서 물리적 현상들에 익숙해져있기 때문입니다. 일부러 왜곡하는 경우는 배제하고 이야기하는 것입니다 ).

뭐가 이상한지 찾아 보았더니 들어온 빛의 세기와 나가는 빛의 세기의 합을 해보니 들어온 빛보다 나가는 빛이 더 많다는 것을 알게 된 것입니다.

그림8 을 보시면 모든 방향으로 빛이 나가는 것을 알 수 있습니다. 다른 방향으로 가고 있는 빛은 관찰자에게 도달할 수 없습니다. 그런데 N·L 은 다른 방향으로 가고 있는 빛을 고려하고 있지 않습니다. 단지 빛과 표면의 노멀의 관계만을 고려한 것이죠.

그래서 나가는 빛의 양을 모두 합산한 다음에 그것으로 나눠줍니다. 예를 들어 피자 한 판을 10 조각으로 나누고 내가 한 조각을 먹었다면, 내가 먹은 비율은 1 / 10 이라고 계산하는 것과 같습니다. [ 7. Light intensity 설정 ] 에서 점광원의 광속( lumen )으로부터 광도( lux )를 계산할 때 전체 입체각의 크기인 4π 로 나눠야 정확한 광도가 나온다는 것을 기억하시나요? 그것과 유사합니다.

이걸 증명하려면 미적분이 들어가므로 여기에서 구체적으로 설명을 하지는 않겠습니다. π 로 나눠야 한다는 것만 알려드리도록 하겠습니다. 실제 유도하는 과정이 궁금하시다면 [ 5 ] 의 "Relating peak luminous intensity and luminous flux" 를 참조하시기 바랍니다.

최종 Diffuse BRDF 식은 식3 과 같이 결정됩니다. 이번에는 식1 과 같은 형태로 정리해 봤습니다.

식3. Diffuse BRDF. 에너지 보존 법칙을 고려.

그렇기 때문에 여러분은 PBR 이 적용된 엔진에서는 Diffuse 가 1/3( π = 3.141592... ) 정도 줄어드는 것을 느끼게 될 것입니다.

우리는 Diffuse 맵( 언리얼에서는 Base texture )을 알베도( albedo, RGB 채널당 표면 반사율 )의 개념으로 사용합니다. 알베도는 절대값인 색상이 아니라 비율입니다. 색상이라기보다는 데이터라는 의미죠. 그러므로 PBR 환경에서는 다른 파라미터를 통해서 밝기를 조정하시는 것이 좋습니다( 예를 들면 광원의 밝기 ).

참고자료

[ 1 ] An Overview of BRDF Models, Rosana Montes and Carlos Urena.

[ 2 ] Bidirectional reflectance distribution function, Wikipedia.

[ 3 ] Lambertian reflectance, Wikipedia.

[ 4 ] Diffuse reflection, Wikipedia.

[ 5 ] Lambert's cosine law, Wikipedia.

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


[ PBR 이란 무엇인가 ] 18. Distribution Function

그래픽스에 익숙하신 분들이라면 BSDF, BRDF, BTDF 와 같은 용어들을 한 번쯤은 보셨을 겁니다. 뭔진 잘 모르겠지만 DF 라는 머릿글자가 동일하다는 것을 알 수 있습니다. 제목에서 이야기하고 있는 "Distribution Function" 의 머리글자가 바로 "DF" 입니다. "Distribution Function" 은 우리말로는 "분포 함수" 정도로 표현할 수 있습니다.

우리는 여러 3D 저작 도구들에서 BRDF 라는 용어를 볼 수 있습니다.

그림1. 3DS Max 의 BRDF 롤아웃.

그림2. Maya 의 Specular 패널.

그림3. V-RAY for Maya 의 Reflection 패널.

그림4. Anorld for Maya 의 Specular 패널. 여기에서는 "Microfacet Distribution" 이라고 되어 있는데 이것도 BRDF 입니다.

명식적으로 BRDF 라는 용어를 사용하지 않더라도 BRDF 관련 파라미터들을 사용하는 경우가 많습니다. 여러분에게 익숙한 "Glossiness" 라든가 "Specular Power" 같은 용어들을 보셨을 겁니다. 보통 그것은 "Phong" 혹은 "Blinn Phong" 을 위한 BRDF 파라미터죠.

딱히 BRDF 에 대해서 알지 못한다고 하더라도 여러 가지 쉐이딩 모델을 비교하는 글들을 본 적이 있었을 겁니다( 그림5 참조 ).

그림5. BRDF 비교. 출처 : Experimental Analysis of BRDF Models.

이런 쉐이딩 모델들의 차이는 어디에서 발생하는 것일까요? "답정너" 같지만 바로 분포 함수( Distribution Function )의 차이입니다.

함수란?

함수라는 것은 무엇입니까? 그것은 입력이 들어 오면 출력을 내뱉어 주는 기계상자로 비유할 수 있습니다.

그림6. 함수를 기계에 비유함. 출처 : [ 2 ].

그림6 에서 볼 수 있듯이 "x" 라는 입력을 넣을 때 "f(x)" 라는 출력을 줍니다. "f" 는 "function" 의 머리글자입니다. 이때 x 의 값이 될 수 있는 값들의 집합을 정의역이라 하고, f(x) 의 값이 될 수 있는 값들의 집합을 치역이라고 합니다.

그런데 여기에서 제약이 있습니다. 반드시 x 와 f(x) 의 값은 1:1 로 대응해야만 한다는 것입니다. 만약 1:1 로 대응하지 않으면 어떤 일이 발생할까요? 여러분이 쿠킹머신에 재료 "A" 를 넣었는데 음식이 "B" 일 수도 있고 "C" 일 수도 있습니다. 이것을 의도한 것이 아니라고 한다면, 이러한 기계를 신뢰할 수 있을까요?

그래서 x 와 f(x) 의 값은 반드시 1:1 로 대응해야 수학적으로 올바른 함수라고 할 수 있습니다. 이 때 이런 f(x) 값들만 모아 놓은 것을 공역이라고 합니다. 그러므로 공역은 치역의 부분집합이죠( 그림 7 참조 ).

그림7. 정의역, 치역, 공역의 관계. X( 붉은색 ) 는 정의역, Y( 파란색 ) 는 치역, 노란색은 공역.

자 이제 "분포 함수" 에서 함수의 의미를 아시겠죠? 특정 입력에 대해서 특정 결과를 내 주는 것이 바로 함수입니다.

함수 f 가 있고 그것은 "f(x) = x + 1" 라고 정의되었다고 합시다. 그러면 반드시 "f(1) = 2" 여야합니다. "f(1) = 3" 일 수도 있고 "f(1) = -1" 일 수도 있으면 안 되겠죠?

그런데 세상에 안 되는 것이 어디있겠습니까? 음함수( Implicit Function ) 이라는 개념이 있습니다. 대표적인 음함수는 원이죠.

식1. 원을 위한 음함수.

이것을 그래프로 그리면 어떻게 될까요?

그림8. 원의 그래프.

식1 을 보시면 알겠지만 하나의 x 값에 두 개의 y 값이 대응됩니다. 그래서 이를 함수로 만들 수가 없죠. 그러므로 이것을 두 개의 함수( explicit function )로 나눠서 그리게 됩니다( 원을 하나의 함수로 그리는 방법이 있긴 합니다. 바로 매개변수를 도입하는 방법인데요, 이것에 대해서는 나중에 기회가 되면 설명하도록 하겠습니다 ).

어쨌든 중요한 것은 어떤 식의 입력값과 출력값이 반드시 1:1 로 대응해야만 그 식을 함수라고 부를 수 있다는 것입니다.

분포란?

"분포"라는 것은 무엇일까요? 확률이나 통계에서 많이 나오죠? 분포는 어떤 요소들이 일정한 범위에 퍼져 있는 모양을 의미합니다. 이것을 함수로 나타내면 분포함수가 되겠죠.

그림9. 정규분포 그래프. 출처 [ 3 ].

그림10. 주사위 두개를 던질 때의 두 눈의 합 S 에 대한 확률분포. 출처 : [ 3 ].

분포라는 것은 어렵게 생각할 필요가 없습니다. 그냥 어떤 패턴이라고 생각하시면 됩니다. 사실 그래픽스에서의 분포는 해석학 영역에 속하기 때문에 조금 다른 의미를 가지고 있지만, 그냥 "분포는 패턴" 이라고 이해하시는 것이 좋습니다( 여기에서 디랙델타함수[ 4 ]를 다룸으로써 미적분과 양자론에 대해 이야기하고 싶지는 않군요 ㅠㅠ ).

그래픽스에서 분포는 그림11 과 같이 로브( lobe )로 표현되는 경우가 많습니다. 로브라는 것은 어떤 물체의 둥글거나 평평한 부분을 일컽는 말입니다. 쉐이더의 차이점이 궁금해서 검색을 해 본 경험이 있는 분들은 그림11 과 같은 그림을 보신 적이 있을 겁니다.

그림11. 여러 reflection lobe 들에 대한 표현. 출처 : Explain the shape of a specular lobe

위의 그림을 어떤 식으로 이해해야 하는지 알아 볼까요? 그림12 에는 붉은색으로 A, B, C 가 있습니다. 이것은 관찰자의 위치를 나타내는 것이죠. 일단 다른 것은 놔두고 "Standard Phong specular lobe" 에 대해서만 알아봅시다( 녹색 로브 ). 원점을 O 라 할 때 OA, OB, OC 가 녹색로브와 만나게 될때까지의 길이가 바로 specular 의 세기를 의미합니다. OA 와 OB 를 비교해 보면 녹색로브와 만날 때까지의 길이는 OB 쪽이 더 길다는 것을 알 수 있습니다. 이는 관찰자가 A 에 있을 때보다 B 에 있을 때 specular 를 더 세게 받는다는 것을 의미하죠. OC 같은 경우에는 녹색 로브와 만나지를 않는군요. 결국 specular 세기는 0 이라는 의미입니다.

그림12. Lobe 와 관찰자 A, B, C 의 관계.

여러분은 specular lobe 의 모양만 보고도 specular 가 뾰족하게 보일지 퍼져 보일지를 알 수 있습니다.

컴퓨터 그래픽스와 PBR 의 선구자인 Disney 같은 경우에는 툴까지 만들어서 BRDF 를 연구하더군요. BRDF Explorer 라는 툴이 있습니다. 링크에 가면 받을 수 있습니다. 그림13 처럼 2D 와 3D 에서 로브를 확인하거나 할 수가 있습니다. 실제로 BRDF 모델을 만들 수도 있습니다.

어떤 쉐이더를 만들기 전에는 BRDF Explorer 를 통해서 아티스트와 그 결과를 미리 확인해 보는 것도 좋겠죠.

그림13. Disney BRDF Explorer 스크린샷. 출처 : BRDF Explorer.

BRDF 와 BTDF

예전에 [ 6. 휘도 측정 ] 에서 BRDF, BTDF 그림을 보여 준 적이 있습니다.

<p

그림14. BRDF 와 BTDF. 출처 : [ 1 ]

반사되서 나가는 빛의 분포를 다루는 것이 RDF( Reflectance Distribution Function, 반사율 분포 함수 ) 이고 투과되서 나가는 빛의 분포를 다루는 것이 TDF( Transmittance Distribution Function, 투과율 분포 함수 ) 입니다.

쉽게 이야기하면 표면에 들어 온 빛이 얼마만큼 반사되었고 얼마만큼 투과되었느냐를 함수로 나타낸 것이죠. 물론 반사는 diffuse 와 specular 가 존재하기 때문에 Diffuse RDF 와 Specular RDF 로 나뉩니다.

자 우리가 자주 접하는 분산함수들은 앞에 "B" 가 붙었죠? 이것은 "Bidirectional" 의 머리글자입니다. 이게 무슨 말이냐? 그림15 처럼 빛과 관찰자의 위치가 변경되어도 관계만 같으면 결과( 반사율 혹은 투과율 )가 동일하다는 것입니다. 반사로 치면 입사각과 반사각이 같으면 어디에 있어도 반드시 같은 결과가 나온다는 의미입니다.

그림15. Bidirectional 의 의미. 입사각과 반사각의 관계가 동일하면 항상 동일한 결과가 나옴.

그런데 왜 bidirectional 이 필요할까요? 여기에 대해서는 명확하게 정리된 글이 없더군요. 그냥 제 생각을 말씀드리도록 하겠습니다.

컴퓨터 그래픽스에서는 성능( 혹은 속도 )을 상당히 중요한 요소로 보고 있습니다. 특히나 실시간 그래픽스라면 그것의 중요도는 말할 필요도 없겠죠. 만약 관찰자와 광원의 관계에 의해 일정한 결과를 도출할 수 없다면, 매우 복잡한 공식이 필요할 겁니다. 예를 들어 그림16처럼 서피스에 방향성이 있는 결이 있다고 하죠.

그림16. 서피스의 방향성 있는 미세한 결.

그림16 와 같은 서피스를 고려한다면 그림15 와 같은 결과를 기대할 수 있을까요? 사용자가 원하는 결과를 얻을 수는 있겠지만 재질이나 기하학적 위치에 따라 공식이 틀려져야 할 것입니다. 아티스트가 이런 것을 모두 관리하기도 힘들 뿐더러 공식이 복잡해지면서 성능도 저하되겠죠.

물론 PBR 에서는 눈에 거의 보이지 않는 미세면( microfacet )이라는 것을 고려하기는 하지만 그림16 처럼 특정 방향성으로 쏠려 있는 미세면이 아닙니다. 일정한 분포를 가지고 있는 미세면들입니다. 그것을 "Microfacet Model" 이라고 부릅니다. 이것에 대해서는 나중에 다루도록 하겠습니다.

어쨌든 일정한 분포를 가진 미세면들을 고려하면 빛과 관찰자의 관계에 의한 반사율은 일관된 방식으로 정의됩니다. 즉 bidirectional 한 성격을 띄게 되며, 하나의 재질에 대해 빛과 관찰자의 관계에 따른 여러 가지 공식을 가지고 있을 필요가 없겠죠.

P.S. "그렇다면 BRDF 로 방향성을 가진 결을 만들 수는 없나요?" 라는 질문을 하실 수 있습니다. 안 되는 게 어디 있겠습니까? NormalMap 등을 사용해서 Normal 을 왜곡시킴으로써 결을 만들어낼 수 있습니다. 하지만 이것은 관찰자와 빛의 관계에 의해 일관된 결과가 나온다는 대전제를 깨는 것은 아닙니다.

참고자료

[ 1 ] Bidirectional scattering distribution function, Wikipedia.

[ 2 ] 함수, 위키백과.

[ 3 ] 확률분포, 위키백과.

[ 4 ] 분포 (해석학), 위키백과.

+ Recent posts