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


[ PBR 이란 무엇인가 ] Fresnel 이란?

프레넬 공식이란?

앞서 [ [ 번역 ] 모든 것은 프레넬을 가집니다 ] 와 [ Reflection 에 대한 잘못된 상식들 ] 에서 프레넬( Fresnel )이라는 용어가 자주 나옵니다. 대체 이게 무엇이길래 PBR 에서는 그토록 중요한 것일까요?

모든 빛은 매질( media )을 만나면 반사, 흡수, 굴절이라는 과정을 거치게 됩니다. 이때 프레넬 공식을 사용해서 빛의 움직임을 계산하게 됩니다.

"프레넬"이라는 것은 "오귀스탱 장 프레넬" 이라는 프랑스 과학자의 이름을 의미합니다( 그림1 ).

그림1. Auguistin-Jean Fresnel. 출처 : [ 2 ].

이 프레넬이라는 사람은 서로 다른 굴절률( refractive index )를 가진 매질( media ) 사이에서 빛이 움직일 때의 동작을 설명했습니다. 빛의 반사를 예측하는 공식을 만들었고 이를 프레넬 반사라고 합니다[ 1 ]. 그러므로 일반적으로 "프레넬" 이라고 이야기하면 "프레넬 공식( Fresnel Equation )" 을 말하는 것입니다.

인간과 빛 ] 에서 빛은 전자기파( electromagnetic wave )라고 이야기한 것이 기억나실 겁니다. 여러 가지 전자기파로 구성된 집합이 빛이죠. 빛이 프리즘을 통과하면서 여러 가지 파장으로 분리되는 것을 기억하고 계실 겁니다( 그림2 ).

그림2. 빛이 프리즘을 통과하면 여러 파장으로 분리됩니다. 출처 : [ 3 ].

이런 일은 왜 벌어지는 것일까요? 지금부터 알아 보도록 하겠습니다.

굴절률( Refractive index )

굴절률은 빛이 진공에서 특정 매질( media )로 이동할 때 속도가 얼마나 느려지는지 그 비율을 측정한 것입니다. 일반적으로 과학 문서에서는 "Index of refraction( IOR )" 이라는 표현이 많이 사용됩니다. "Refractive index" 와 "Index of refraction" 은 같은 의미입니다. "index" 는 사전적 의미로 "지수" 라는 뜻을 가집니다. "물가지수", "임금지수" 이런 표현을 할 때 사용하죠. 즉 우리 말로 억지로 번역하자면 "굴절지수" 정도가 되겠습니다. 그냥 굴절률이라고 생각하시면 됩니다.

빛의 속도는 초당 지구 일곱바퀴 반을 돌 수 있는 매우 빠른 속도( 299,792,458 m/s )입니다. 지구에서 달까지 1 초면 갈 수 있죠. 그런데 이것은 진공( vaccum ) 기준에서의 속도이며, 실제로는 어떤 매질을 만났을 때 속도가 감소합니다. 왜 감소하는지에 대해서는 설명하지 않겠습니다. 왜냐하면 이를 설명하기 위해서는 글이 좀 어려워질 수 있고 이 문서의 주제를 벗어나기 때문입니다. 에너지 보존 법칙과도 관계가 있는데요, 만약 궁금하시면 위상 속도( phase velocity ) 문서를 참고하시기 바랍니다.

어쨌든 매질을 만나면 빛의 속도가 줄기 때문에 빛의 방향도 바뀝니다. 이를 좀 쉽게 설명하려면 바퀴의 예를 들 수 있습니다( 그림3 )( 빛에 대해서 이해하고 싶으신 분들은 뉴턴 하이라이트의 "빛이란 무엇인가" 라는 책을 필독하실 것을 권장합니다. ).

그림3. 속도가 다르면 빛이 꺾이는 이유. 출처 : [ 5 ].

그림3 에서 볼수 있듯이 포장도로에서 모래로 바퀴가 진입하면 마찰력때문에 한쪽바퀴의 속도가 줄어들죠. 그런데 다른쪽 바퀴는 여전히 같은 속도로 움직이므로 몸체의 방향이 틀어집니다. 그런데 만약 바퀴가 작다면 더 많이 회전해야 하므로 그 동안 느린쪽 바퀴의 방향은 더 틀어지겠죠. 반대로 바퀴가 크다면 더 적게 회전하므로 다른쪽 바퀴가 덜 틀어지겠죠.

바퀴의 크기는 주파수와 연관해서 생각할 수 있습니다. 그림2 를 다시 보죠( 스크롤이 귀찮으니 밑에 이미지를 복사해 넣었습니다 ).  

파장이 긴( 바퀴가 큰 ) 붉은 빛은 덜 꺾이고, 파장이 짧은( 바퀴가 짧은 ) 보라색 빛은 많이 꺾이는게 보이시죠? 굴절률이 제대로 계산되기 위해서는 파장별로 처리되어야 합니다. 하지만 대기 산란( atmospheric scattering )처럼 파장별 산란 결과가 중요한 분야가 아니라면 그냥 대충 퉁쳐서 처리하곤 합니다.

스넬의 법칙( Snell's law )

과거에 사람들은 매질이 다르면 빛이 꺾인다는 것 까지는 알게 되었지만 얼마나 꺾이는 지까지는 모르고 있었습니다. 이것을 공식화 한 사람이 바로 스넬( Snell )입니다. "스멜~" 이 아니라 "스넬" 입니다. 이 스넬의 법칙은 고등학교 때도 배워서 들어는 보셨을 겁니다.

그림4. 서로 다른 굴절률을 가진 매질에서의 빛의 굴절. 출처 : [ 6 ].

그림 4에서 붉은색 라인은 빛의 경로를 의미합니다. 매질의 경계( interface ) 에서 빛이 굴절합니다. 표면의 노멀( normal )과 입사광( incident light )의 각은 θ1 입니다. 그리고 노멀과 굴절광( refracted light )의 각은 θ2 입니다. v 는 속도( velocity )를 의미하고, λ 는 파장( wavelength )를 의미합니다. 그리고 n 은 굴절률( IOR )을 의미하죠. 이것들의 관계를 설명한 것이 바로 스넬의 법칙입니다( 식1 ).

식1. 스넬의 법칙. 출처 : [ 6 ].

이런 현상 때문에 기름과 물을 컵에 채워놓고 파동을 만들면 그림5 와 같은 결과가 나오게 됩니다.

그림5. 스넬 법칙에 따른 파동의 변화. 출처 : [ 6 ].

그런데 이 굴절과 관련해서 좀 재밌는 현상이 있습니다. 빛이 굴절률이 다른 매질을 만나게 되면 특정 각도에서는 굴절을 하지 않고 완전히 반사를 하는 경우가 있다는 겁니다( 그림7 ).

그림7. 빛의 굴절 패턴. 특정 각도에서는 전반사가 발생함( 오른쪽 ). 출처 : [ 7 ].

위의 그림에서 Critical angle 이라고 된 각도를 넘어서면 전반사가 발생합니다. 임계각을 구하는 공식은 식2 와 같습니다.

식2. 전반사각 구하는 공식. 출처 : [ 7 ].

아크릴 병 내부에서 바깥쪽으로 빛이 전반사되는 예를 들면, 대기의 굴절률이 1.0 이고 아크릴의 굴절률이 약 1.50 이므로 전반사 각도는 41.8 도입니다.

식3. 아크릴 병의 전반사각 계산. 출처 : [ 7 ]

프레넬 공식( Fresnel equation )

자 이제 우리는 어떤 매질에서 여행하고 있던 빛이 다른 매질을 만나게 되면 반사하거나 굴절하게 된다는 것을 알게되었습니다. 물론 흡수될 수도 있지만 여기에서는 다루지 않겠습니다.

우리가 그래픽스에서 반사와 굴절을 계산하기 위해서는 얼마만큼의 빛이 반사되고 얼마만큼의 빛이 굴절되는지 알아야 합니다. 그것을 알려주는 공식이 바로 프레넬 공식입니다.

프레넬 공식을 그래프로 나타내면 다음과 같은 결과가 나옵니다.

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

그림이 좀 어려워 보이죠? 가로축이 눈과 노멀방향의 각도이고 세로축이 반사율입니다.보시면 알겠지만 물이나 풀과 같은 비금속 물질들은 수직으로 봤을 때( 0 도 ) 매우 낮은 반사율을 보이며, 수평으로 봤을 때( 90 도 ) 매우 높은 반사율을 보입니다. 비금속같은 금속같은 경우에는 어디에서 보든 0.5 이상의 반사율을 보여 주죠.

그런데 우리가 모든 각도에서의 굴절률( IOR )을 알 수는 없습니다. 그러므로 대충 근사계산을 하는 식( 일반적으로 Shilick's approximation, 식4 )을 사용합니다. 그리고 입력값으로 물체를 수직에서 바라본( 0 도 ) 반사율값을 넣는 근사 계산식을 사용합니다. 위의 "프레넬 공식 자세히 보기" 를 펼쳐 본 사람들을 위해서 설명을 드리자면, R0 값이 바로 그림8 에 있는 그래프에서 0 도의 반사율 값이라 생각하시면 됩니다. 대부분의 엔진이나 문서에서는 F0 라고 표현을 합니다( 아마도 "Fresnel at Degree 0" 의 약자겠죠 ).

만약 정확한 값을 넣고자 한다면, 모든 매질의 굴절률 값을 수집한 다음에 계산을 하시면 됩니다. 일반적으로는 관찰자가 대기 속에 있다고 가정하기 때문에 어떤 매질의 굴절률이 n 이라고 할 때 다음과 같이 계산됩니다.

식5. F0 계산.

물의 예를 들어 보죠. 물의 경우에는 1.33 의 굴절률을 가지고 있습니다. 이를 식5 에 넣어 보면 F0 는 식6 과 같이 계산됩니다.

식6. 물의 F0 계산.

각 매질의 굴절률( IOR )은 [ IOR LIST ] 라는 페이지에 정리되어 있습니다. PDF 로 정리된 것도 있습니다[ IOR_Table.pdf ].

일반적으로 이 F0 를 "Metallic" 핀에다가 넣어 주시면 됩니다.

UE4 의 프레넬 노드

프레넬 공식은 림라이트나 실루엣을 만들기 위한 공식이 아닙니다. 하지만 그런 효과를 원하시는 분들을 위해서 Fresnel 노드가 따로 존재하기는 합니다[ 10 ].

그림9. 프레넬 노드. 출처 : [ 10 ].

하지만 이것을 사용하는 것에 대한 책임은 본인이 지셔야 합니다. 왜냐하면 Metalic 으로서 반영되는 Fresnel 은 그 의미가 명확하지만, 이 노드를 사용하는 것은 그냥 효과이기 때문입니다. 이 노드를 사용하게 된다면 비물리적인 결과를 산출할 수 있습니다. 보통 이 노드를 사용할 때는 Metalic 을 제거하고 Emissive 를 사용합니다.

그림10. UE4 프레넬 노드의 사용. 출처 : [ 10 ].

참고자료

[ 1 ] Fresnel equation, Wikipedia.

[ 2 ] Auguistin-Jean Fresnel, Wikipedia.

[ 3 ] Light, Wikipedia.

[ 4 ] Refracitve index, Wikipedia.

[ 5 ] 빛이란 무엇인가? 10 page, Newton Highlight. 일본 뉴턴프레스.

[ 6 ] Snell's law, Wikipedia.

[ 7 ] Refraction, Wikipedia.

[ 8 ] Schlick's approximation, Wikipedia.

[ 9 ] Real Shading in Unreal Engine 4.

[ 10 ] 머티리얼에 프레넬 사용하기, UE4 Document.

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


[ PBR 이란 무엇인가 ] 16. Reflection 에 대한 잘못된 상식들

사전적 의미

우리는 일상적으로 diffuse reflection( 확산방사 ) 과 specular reflection( 정반사 ) 이라는 용어를 사용합니다. 그런데 정말로 그 의미를 알고 사용하고 계시나요?

일단 diffuse 의 사전적인 의미를 살펴 보도록 하겠습니다.

1. ( 빛, 열, 냄새 따위를 ) 발산[ 방산( 放散 ) ]하다.

2. ( 지식을 ) 넓히다, 보급시키다, ( 정서 따위를 ) 충만시키다.

3. [ 理 ] ( 기체나 액체를 ) 확산( 擴散 )시키자; [ 理 ] ( 빛을 ) 산란시키다.

출처 : 네이버 사전.

여러분이 알고 있는 뜻과 일치하나요?

이제 specular 의 사전적 의미도 살펴 보도록 하겠습니다.

1. 거울 같은, 비추는, 반사하는, 반영하는

2. ( 광학 ) 정( 正 )반사성의

출처 : 네이버 사전.

이것도 여러분이 알고 있는 뜻과 일치하나요?

이제 저런 사전적인 의미가 실제적인 의미와 얼마나 일치하는지 살펴 보도록 합시다.

Diffuse 반사는 표면의 거칠기 때문에 발생한다?

많은 분들이 diffuse reflection 이 표면의 거칠기 때문에 발생한다고 생각합니다. 특히 PBR 에 있어 중요한 요소인 미세면( microfacet )을 생각하면 그렇게 생각하는 것도 당연합니다. 하지만 diffuse 는 대부분 표면의 거칠기 때문에 발생하는 것이 아닙니다. 물론 일부는 그렇게 발생합니다.

사전적인 의미로 봤을 때 diffuse 는 "발산", "확산" 이라는 의미를 가지고 있습니다. 즉, 단순하게 표면에 부딪혀서 반사되어 나오는 요소가 아니라는 의미입니다.

[ 1 ] 에 의하면, diffuse 가 발생하는 원리는 다음과 같습니다. 글의 일부를 번역해 보았습니다.

Solids( 인공물 )에서  diffuse reflection 은 일반적으로 표면의 거칠기 때문에 발생하지 않습니다. 물론 평평한 표면에서 specular reflection 이 발생하지만, 그렇다고 해서 그것이 diffuse reflection 이 발생하는 것을 막지는 않습니다. 하얀 대리석을 매우 연마( polishing )해도 하얀색은 남습니다; 아무리 연마를 해도 그것이 거울이 되지는 않습니다. 연마는 약간의 specular reflection 을 산출하지만, 나머지 빛은 여전히 확산되게 반사됩니다.

어떤 표면이 diffuse reflection 을 제공하는 가장 주요한 원리에서, 그것은 정확하게는 표면이라는 개념을 포함하고 있지 않습니다: 대부분의 빛은 아래 그림에서 보이는 것처럼 표면 아래 존재하는 scattering center( 산란 센터, 역주 : 전자기파가 산란되는 곳 )들의 영향을 받습니다.

물론 매우 일부이기는 하지만 산란없이 diffuse reflection 을 보여 주는 경우는 존재합니다. 아래 그림처럼 표면 아래로 빛이 흡수되지는 않았는데 그 표면이 매우 거칠어서 여러 반향으로 반사가 되었다면 그것도 현상적으로 봤을 때는 diffuse 라고 이야기할 수 있겠죠.

비균일 표면으로부터의 diffuse reflection. 출처 : [ 1 ].

굳이 이러한 원리에 대해서 이야기하는 이유는 무엇이라 생각하시나요? "쓰는 사람 입장에서 그러든지 말든지 상관없잖아요?" 라고 하시는 분들 계실 수도 있습니다.

하지만 이 이야기를 하는 이유는 albedo( 반사율 ) 에 대해서 이야기하기 위함입니다. 우리가 흰색 빛을 물체에 쐈을 때 사과는 붉은색으로 보이고( 물론 녹색 사과도 있지만 딴지는 걸지 말아 주세요 ㅠㅠ ), 나뭇잎은 녹색으로 보입니다. 보통 이에 대해서 설명할 때 붉은색을 반사했다고 표현하는데, 사실은 표면 아래도 들어가 산란이 일어나면서 일부 파장을 흡수하고 나머지 파장이 방출된 것입니다.

자! 그럼 그냥 표면에서 반사해 버린 빛과 표면 아래에서 산란시켜서 반사해 버린 빛의 차이가 보이나요? Specular reflection 은 반사되었을 때 자신의 빛의 파장을 그대로 유지하지만, diffuse reflection 은 재질의 구성에 따라서 반사되었을 때 자신의 빛의 파장을 유지하지 못합니다. 그러므로 specular reflection 은 빛의 색을 그대로 유지하고 diffuse reflection 은 빛의 색을 유지하지 못하는 것입니다.

일반적인 경우에 표면 아래에서의 산란을 계산하기에는 너무 복잡하고 계산비용이 비쌉니다. 그래서 이를 albedo 라는 개념으로 퉁치는 거죠. 

그런데 여기에서 한가지 의문이 들 수 있습니다. 왜 specular 도 albedo 의 영향을 받느냐는 겁니다. 실제로 UE4 같은 엔진을 사용해 보면 Yellow( = Red + Green ) 라이트를 Green 재질에다가 쐈을 때 specular 성분에 순수한 Green 색상이 포함됩니다. 그냥 순수한 Yellow 가 나와야할 것 같은데 말이죠... 그 이유는 위의 위키피디아 글에서도 언급되어 있듯이 평평한 면이라고 하더라도 diffuse 를 막을 수 없기 때문입니다. 세상에는 순수하게( 혹은 이상적으로 ) 매끈한 평면이란 존재하지 않습니다. 이 부분은 Fresnel 과 관련이 있는데 나중에 자세히 다루도록 하겠습니다.

모든 물체는 diffuse reflection 을 가진다?

그렇지 않습니다. 금속( metal ), 빛이 들어갈 수 없는 물질, 개스( gas ), 액체( liquid ), 유리( glass ), 투명 플래스틱( transparent plastic ), 일부 보석( gem )들이나 소금 결정( salt crystal )과 같은 단결정( single crystal ) 물질들, 그리고 티슈( tissue )나 수정체( lens of a eye ) 같은 매우 특별한 재질들은 diffuse reflection 을 가지지 않습니다[ 1 ].

사실 이러한 재질들에 대해서 모두 설명하는 것은 어렵기 때문에 우리가 가장 흔하게 접하게 되는 금속에 대해서만 설명을 드리도록 하겠습니다.

금속은 모든 빛을 흡수합니다. 즉 albedo 는 0 이라고 할수 있습니다. 그런데 어떻게 반사가 생기는 걸까요? 금속 내부의 자유전자는 에너지를 받으면 아래 그림처럼 방출됩니다. 그래서 금속은 자신을 구성하고 있는 원자에 따라서 고유의 색상을 가지게 되는 거죠.

금속의 반사의 본질.

그러면 금속은 어느 방향으로 반사를 시킬까요? 여기에서 구체적으로 언급하지는 않겠지만 그것은 Fresnel 과 관련이 있습니다. 나중에 자세하게 다루도록 하겠습니다. 

Specular reflection 은 입사각과 반사각이 같을 때 가장 세다?

우리는 일반적으로 거울면 반사, 즉 정반사는 입사각과 반사각이 같을때 가장 세다고 알고 있습니다. 하지만 그것은 사실이 아닙니다. 이는 표면의 roughness 에 따라 달라집니다. 이 역시 Fresnel 과 관련이 있습니다. 이 역시 나중에 자세하게 다루도록 하겠습니다.

어쨌든 일반적인 재질에서 specular 는 거울면 반사를 하지 않고 약간 벗어나서 반사를 합니다. 이를 off-specular reflection 이라 부릅니다. 가장 센 곳을 off-specular peak 라고 부르죠. 굳이 우리말로 번역하자면 "정반사를 벗어난 반사" 정도 되겠습니다.

Off-specular reflection 의 예: 지표각에 가까워질수록 specular 방향( M )이 정반사의 각과 달라짐. 출처 : [ 2 ].

참고자료

[ 1 ] Diffuse reflection, Wikipedia.

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

주의 : 번역이 개판이므로 이상하면 원문을 참조하세요.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

원문 : How To Split Specular And Diffuse In Real Images


How To Split Specular And Diffuse In Real Images

실제보다는 어렵다고 생각하는 것을 정리해 두십시오. 제가 집에서 만든 것은 실제 이미지에서 diffuse 요소와 specular 요소를 분리하는 편광을 사용하는 기능입니다. 아티스트들은 사진 레퍼런스를 찾기 위해 많은 시간을 들입니다. 하지만 specular 와 diffuse 를 분리하는 것은 재질을 이해하는 데 있어 도움을 줍니다. 타이틀 이미지에서( 역주 : 여기에는 타이틀 이미지가 없습니다. 첫 번째 이미지를 의미합니다 ), 왼쪽은 diffuse 만 나온 것이고, 중간은 diffuse 와 specular 가 같이 나온 것이고, 오른쪽은 specular 만 나온 것입니다. 제가 여기에 대한 전문가는 아니지만, 그것을 이해하는 방식에 대해서 이야기하고자 합니다.

 

 1. Original

 Image:

 

 2. Diffuse Only:

 

 3. Specular Only:

 

이걸 스스로 하고 싶다면, 다음과 같은 것들이 필요합니다:

1. 수동 모드로 찍을 수 있는 카메라. 예를 들면 SLR.

2. 카메라를 만지지 않고 여러 장을 찍을 수 있도록 해 주는 원격 셔터 콘트롤러.

3. 광원. 저의 경우에는 Ikea 에서 산 램프를 사용합니다.

4. 편광 필름 몇 개. 저는 polarization.com 에서 구합니다. 여러분은 "Fully Laminated Linear Polarizer Sheets" 를 원할 겁니다. Linar 필터인지 확인하세요. Circular 필터를 구하시면 안 됩니다.

초기 단계에 컴퓨터 그래픽스에서는 오브젝트가 diffuse 반사와 specular 반사를 모두 가지고 있다고 가정했습니다. 어떤 빛이 표면을 비추고 있고 그 근처에 카메라가 있다고 가정해 봅시다. 그런데 이런 모델은 엄청나게 단순화된 모델입니다.

표면을 비추는 일부 빛들은 엣지( edge, 역주 : 그림에서 표면의 테두리를 의미하는 듯 )에서 몰래 빠져 나갑니다. 우리가 백색 빛과 파란색 표면을 가지고 있다면, 그 빛은 백색으로 그냥 남아 있을 겁니다. 우리는 이것을 specular 라고 부르죠.

어떤 빛은 표면에 의해 흡수될 것입니다. 일부 전자들은 소멸될 것이고, 새로운 포톤들이 랜덤한 방향으로 방출될 겁니다. 만약 우리가 백색 빛과 파란색 표면을 가지고 있다면, 방출되는 빛은 파란색이 겁니다. 우리는 이를 diffuse 라고 부릅니다.

여러분은 이미 그 사실을 알고 계실 겁니다. 그렇지 않다면 이제 알게 됐겠죠. 흥미로운 점은 그 빛이 편광될( polarized ) 수 있다는 것입니다. 여러분의 친구인 wikipedia 에 가면 더 많은 것을 배울 수 있을 겁니다. 게다가 specular 빛은 자신의 입사 편광( incoming polarization )을 유지하지만 diffuse 빛은 그렇지 못합니다. 그래서 diffuse 빛은 랜덤한 방향으로 랜덤한 편광을 가진채 다시 전파되는 겁니다. 우리는 그것을 비편광되었다( unpolarized )고 말할 수 있죠( 역주 : [ 편광으로 입체 영화를 본다 ] 에 좀 더 쉬운 설명이 있습니다 ).

여기에 장치가 있습니다.

매우 기본적입니다. 저는 카메라의 모든 설정을 수동 모드로 만들었습니다. 이런 의미죠:

1. 수동 노출( exposure, 역주 : [ 이제 노출을 조정해 보자 ] 를 참조하세요 ).

2. 수동 조리개( aperture, 역주 : [ 이제 노출을 조정해 보자 ] 를 참조하세요 ).

3. 수동 화이트 밸런스( white balance, 역주 : [ 화이트 밸런스 완벽 컨트롤하기! ] 를 참조하세요 ).

4. 수동 감도( ISO, 역주 : [ 카메라 감도( ISO )란? ] 을 참조하세요 ).

5. 자동 초점( Auto Focus ) 끄기.

6. 색상 프로우파일( profile )을 Adobe 98 이 아니라 sRGB 로 설정( 표준 감마 스페이스 색상 공간, 역주 : [ RGB 색공간 ] 을 참조하세요 ).

그리고 원격 셔터에서 손가락을 살짝 뗍니다. 그런 방식으로 저는 카메라에 손대지 않고 여러 장의 사진을 찍습니다. 만약 여러분이 카메라를 손대서 여러 장의 사진을 찍는다면, 정렬이 흔들릴 것이라고 생각합니다. 그리고 우리는 광원을 가지고 있습니다. 이제 광원에 대해 자세히 살펴 보죠.

광원은 그냥 Ikea 에서 사온 할로겐( halogen, 역주 : 발음이 핼러즌 ㅡㅡ ) 램프입니다. 하지만 그 앞에 선형 편광 필터가 달려 있습니다. 그 필터를 전기식 테이프( electrical tape )로 붙였습니다. 왜냐하면 저는 품격이 있는 사람( claasy guy )이니까요. 경고를 하나 하자면, 할로겐 램프는 엄청 뜨거워지므로 제 편광 필터가 녹아버려서 좀 휘었습니다.

이제 우리가 할 일은 두 개의 사진을 찍는 겁니다. 그렇지만 카메라 앞에 편광 필터를 달 것입니다. 카메라와 광원에 모두 편광 필터를 달아야 한다는 것을 기억하세요. 만약 제가 비디오 게임 프로그래머가 되기 위해 LA 에 왔다고 생각한다면, 잘못 생각하고 계신 겁니다. 손 모델의 꿈을 꾸고 있는 동안 돈을 버는 방법일 뿐입니다( 역주 : 안 웃김 ㅠㅠ ).

편광 필터에 오렌지색 테이프가 보이세요? 저는 이제 편광 필터를 90 도 회전시킬 것이고 다른 사진을 찍을 겁니다. 오렌지 테이프가 어떻게 이동했는지 확인해 보세요.

이제 우리가 찍은 첫 번째 사진이 있습니다. 정렬이 완벽하게 되었다면, 그 안에 specular 가 전혀 없을 겁니다. 물론 보통 그런 경우는 있을 수가 없죠. 왜냐하면 손으로 정렬을 완벽하게 하는 것은 불가능하기 때문입니다.

이것이 어떻게 동작할까요? 편광이 표면에 비춥니다. Specular 빛은 표면에서 반사되어서 카메라로 들어 오죠. 그 빛은 편광 필터에 도달하고, 그 편광 필터는 빛의 편광에 대해 수직으로 정렬되어 있습니다. 그러면 편광 필터에 의해 모든 것( specular )이 흡수됩니다. 반면에 diffuse 빛은 표면에 의해 흡수되기는 하지만 비편광된 상태로 다시 방출됩니다. 그래서 편광 필터는 diffuse 빛의 절반만 흡수합니다. 그리고 나머지는 카메라로 들어 오게 되죠. 그래서 그 이미지는 50% 의 diffuse 와 0% 의 specular 를 가집니다. 이제 두 번째 이미지를 보죠.

이 녀석은 카메라로 향하는 specular 빛에 대한 편광이며 편광 필터에 대해 정렬되어 있습니다. 그래서 모든 빛이 통과하게 되죠. 반면에 diffuse 빛은 여전히 비편광 상태이며, 절반이 흡수됩니다. 이 이미지는 50% 의 diffuse 와 100% 의 specular 를 가집니다.

만약 첫 번째 이미지를 A 라고 하고 두 번째 이미지를 B 라고 한다면, diffuse 이미지는 2 * A 이고 specular 이미지는 B - A 입니다. 물론 이 이미지들은 sRGB 프로우파일로 저장되어 있습니다. 그래서 두 개의 이미지를 비교하고 그것들을 분리해서 각 결과를 sRGB 이미지로 만드는 쉐이더 코드를 만들었습니다. 항상 그렇듯이, 이 코드를 실제로 테스트해 본 건 아닙니다.

float LinearToSrgb(float val)
{
   float ret;
   if (val <= 0.0)
      ret = 0.0f;
   else if (val <= 0.0031308f)
      ret = 12.92f*val;
   else if (val <= 1.0f)
      ret = (pow(val, 0.41666)*1.055f)-0.055f;
   else
      ret = 1.0f;
   return ret;
}

float SrgbToLinear(float val)
{
   float ret;
   if (val <= 0.0f)
      ret = 0;
   else if (val <= 0.04045f)
      ret = val / 12.92f;
   else if (val <= 1.0f)
      ret = pow((val + 0.055f)/1.055f,2.4f);
   else
      ret = 1.0f;
   return ret;
}

int g_bSpecOrDiff;

float4 ps_main( float2 texCoord  : TEXCOORD0 ) : COLOR
{
   float3 srcA = tex2D(Texture0, texCoord ).rgb;
   float3 srcB = tex2D(Texture1, texCoord ).rgb;
   float3 linA = SrgbToLinear(srcA);
   float3 linB = SrgbToLinear(srcB);
   float3 linDiff = linA*2;
   float3 linSpec = linB-linA;
   float3 texDiff = LinearToSrgb(linDiff);
   float3 texSpec = LinearToSrgb(linSpec);
   float3 ret = g_bSpecOrDiff ? texDiff : texSpec;
   return ret;
} 

만약 이 코드가 맞다면 여러분의 diffuse 이미지는 다음과 같이 보일 겁니다:

그리고 specular 이미지는 다음과 같이 보일 겁니다:

이 절차는 완벽한 것은 아닙니다.

1. 보통 diffuse-only 이미지에서 약간의 specular 를 포함하게 될 것입니다.

2. 어떤 물체들에 대해서는 별로 좋은 결과를 내지 못합니다. Specular-only 이미지에서, 손잡이가 약간 푸르스름합니다. 저는 손잡이가 유전체( dielectric )여서 ( 역주 : 빛의 ) 주파수를 약간 교란한다고 생각합니다.

3. 만약 specular 나 diffuse 이미지가 1.0 에서 잘린다면( clamping ), 그런 픽셀들은 엉망이 될 겁니다. 그럴 때는 노출값을 낮추는 것이 좋습니다.

4. 원격 셔터를 사용하십시오. 그렇지 않으면 정렬 문제가 생길겁니다.

별로 문제가 많이 발생하지 않고 여러분만의 specular/diffuse 분리를 해낼 수 있었으면 좋겠네요.

휴~ 긴 글이었습니다.

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

주의 : 번역이 개판이므로 이상하면 원문을 확인하세요.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

원문 : Everything has Fresnel

이번에는 지난 시간에 이어 specular 현상이 왜 발생하는지에 대해서 다루는 John Hable 의 글을 번역해 보았습니다. 쉐이더 코드가 일부 들어 가 있지만 같이 나오는 다이어그램을 보시면 이해하기가 크게 어렵지는 않을 것입니다.


[ PBR 이란 무엇인가 ] 15. [ 번역 ] 모든 것은 프레넬을 가집니다

이 포스트는 "모든 것은 빛납니다" 라는 포스트의 2탄이라고 생각하셔도 됩니다. 표준 specular 라이팅이 게임에서 매우 자주 사용되지만, 우리가 게임에서 거의 보기 힘든 효과는 바로 프레넬( fresnel )입니다.

여러분은 이제 specular 가 무엇인지 알고 있습니다. 비디오 게임에서 가장 일반적인 specular 모델은 Blinn-Phong 이며 다음과 같이 정의됩니다.

 H = normalize( V + L )
 specVal = pow( saturate( dot( H, N ) ), power );

이 경우 V 는 뷰 벡터이며, L 은 라이트 벡터입니다. 그리고 N 은 노멀 벡터이고, power 는 specular 요소입니다. H 는 유도된 하프 벡터이며, 이 벡터는 뷰 벡터와 라이트 벡터의 절반을 의미합니다.

이것은 어떻게 동작하는 것일까요? 여기 다이어그램이 있습니다.

여러분은 뷰, 라이트, 노멀 벡터를 볼 수 있습니다. 자, 이 함수를 사용하면, specular value peak( specular 값이 가장 큰 부분 ) 는 어디에 생길까요? 직관적으로 볼 때, 여러분은 뷰 벡터가 라이트 벡터에 대한 반사 벡터일 때 specular 함수가 최대이기를 원할 겁니다. 그러면 무슨 일이 벌어질까요? 이 함수는 하프 벡터가 노멀에 정확하게 정렬되었을 때 최대값이 되는데, 이는 뷰 벡터가 라이트 벡터에 대한 정확한 ( 거울같은 ) 반사 벡터일 때 발생합니다.

여기에 다른 경우가 있습니다:

역시 뷰 벡터는 라이트 벡터로 반사됩니다. 이 경우에 specular highlight 가 더 밝을까요, 아니면 더 흐릿할까요, 아니면 첫 번째 경우랑 같을까요? 글쎄요, 그것은 같습니다( 역주 : 계산 결과로만 보자면 같다는 의미 ). 왜냐하면 여러분은 두 경우에 모두 specular highlight 의 최대 값을 보고 있는 것입니다. 이것이 실세계에서는 어떻게 동작을 하는 것일까요? 짧은 답은 NO 입니다.

여기에 벽돌 그림이 있는데, 서로 다른 카메라 각도에서 촬영한 것입니다. 위의 이미지에서 빛과 카메라는 모두 아래쪽을 향하며, 이것은 첫 번째 경우를 표현합니다. 두 번째 줄에서는, 빛이 지표각( grazing angle )에서 비추고 있으며, 이는 두 번째 경우를 표현합니다. 필자는 specular 와 diffuse 를 편광필터로 분리했으며, 그래서 왼쪽에 있는 것은 diffuse 이며, 오른쪽에 있는 것은 specular 입니다. 벽돌을 체크해 보죠.

어쩌라고!!! 빌어먹을 벽돌처럼 단순한 재질에 대해서도 specular 에 대한 Blinn-Phong 모델은 완전 잘못된 결과를 냅니다. 그리고 이러한 일이 발생한 이유는 프레넬이라 불리는 자명한 것 때문입니다.

다른 두 가지 경우의 specular 를 살펴 보도록 합시다. Blinn-Phong 에 의하면, 그것들은 동일한 세기를 가지지만, 현실에서는 지표각에 가까울수록 훨씬 밝아집니다( 역주 : 필자가 무슨 의도로 그림을 더 첨부했는지 모르겠지만 첨에 나왔던 그림과 동일합니다. 차이가 뭔지 알아 보려고 노력하실 필요는 없습니다. 그냥 스크롤 하지 말라고 그랬나 봅니다 ).

 

이 효과를 다루려면, 여러분은 프레넬을 사용할 수 있습니다. 프레넬을 근사계산하는 매우 좋은 실시간 근사계산은 바로 Schlick Fresnel 입니다. From the GPU Gem 3 chapter on skin:

 float base = 1 - dot( V, H );
 float exponential = pow( base, 5.0 );
 float fresnel = exponential + F0 * ( 1.0 - exponential );
 specVal *= fresnel;

왠지는 모르겠지만 대부분의 사람들은 물, 유리, 금속과 같이 정말 밝게 빛나는 표면에서만 프레넬이 나오기를 원하는 경향이 있습니다. 하지만 실제로는 프레넬은 거의 모든 재질에 존재하는 강한 효과입니다. 사실 필자는 프레넬은 덜 빛나는 재질에서 가시적으로 더욱 중요한 역할을 한다고 주장하고 싶습니다. 여기 PVC 파이프의 일부가 있습니다.

분명히, PVC 는 프레넬을 가집니다. 그러나 필자의 관점에서는 프레넬이 PC 보다는 벽돌에서 더 가시적으로 중요한 효과를 가진다고 이야기하고 싶습니다. 아무 것도 없는 데서 강한 specular 가 나오는 것이 높은 specular 를 더 높게 만들어 주는 것 보다는 더 중요합니다. 그게 더 중요한 효과가 아닐까요? 필자에게 있어, 물, 유리, 금속을 위해서만 프레넬을 고려하는 것은 잘못된 것이라고 봅니다. 왜냐하면 그것은 덜 빛나는 표면에서 엄청난 가시적 차이를 만들기 때문입니다. 여기에 몇 가지 예제가 더 있습니다.

싸구려 판지. 매우 오해를 받고 있습니다. 그것은 항상 "순수 diffuse 재질"로서 참조되고 있습니다. 심지어는 그것이 실제로는 그것의 빛나는 친구들과 어울려 다닐 자격이 있음에도 불구하고 말이죠. Specuar 는 직각에서 중요합니다. 왜냐하면 그것이 미묘한 채도 감소( subtle desaturation )를 추가하기 때문입니다. 하지만 판지는 지표각에서 매우 밝은 specular 반사를 보여 줍니다.

여러분이 아침에 일하러 가기 위해 운전을 할 때 왜 더 밝은지 생각해 본 적이 있으신가요? 대부분의 사람들은 태양이 자신들의 눈에 들어 오고 있기 때문이라고 생각합니다. 사실 그 밝음의 주요 원인은 포장도로가 매우 강한 프레넬을 가지고 있기 때문입니다. 다음에 운전할 때 태양이 눈에 들어 오면, 사이드 미러를 확인해 보십시오. 그러면 사이드 미러에 보이는 포장도로가 당신의 전면에 있는 포장도로보다 얼마나 어두운지 알 수 있을 것입니다.

여기에 어떤 천이 있습니다. Ikea 에서 가지고 온 수건입니다. 거친 면재질 천은 여러분이 집 주변에서 볼 수 있는 일반적인 재질보다 더 적은 specular 를 가집니다. 이러한 비교는 썩 좋지는 않은데, 두 번째 이미지가 전체적으로 더 밝기 때문입니다. 그래서 specular 에서 diffuse 로 상대적으로 변환하는 것을 보기가 힘듭니다. 만약 더 좋은 예를 원하신다면, 그것은 독자의 경험으로 남겨 두겠습니다.

그리고 재미로 X-Rite 컬러 체커를 확인해 봅시다. 컬러 체커를 사용할 때, 여러분은 카메라로부터 수직으로 그것을 배치하는 것이 좋습니다. 왜 그렇게 해야 하는지 저에게 물어볼 필요가 없어졌으면 좋겠군요.

프레넬 만세!

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

주의 : 번역이 개판이므로 이상하면 원문을 확인하세요.

주의 : 허락받고 번역한 것이 아니므로 언제든 내려갈 수 있습니다.

원문 : Everything is Shiny, Jonh Hable.

지난 시간까지는 조도( illuminance )에 대한 내용들을 중점적으로 다뤘지만, 이번 시간부터는 휘도( luminance )에 대한 내용을 중점적으로 다루게 됩니다. 

PBR 라이팅 모델에서 휘도계산을 하는데 있어서 기존의 라이팅 모델들과 다른 점은 여러 가지가 있지만, 아티스트들의 입장에서 가장 크게 느껴지는 부분은 diffuse 와 specular 가 계산되는 방식일 겁니다. 예전에는 diffuse 와 specular 의 세기를 아티스트가 직접 설정해야만 했습니다. 물론 완벽하게 이해하고 사용하는 것은 아니지만 대충 값을 조정하다가 보면 원하는 결과가 나오곤 했습니다.

그런데 PBR 로 오면서 metalicity( 금속성 ) 와 roughness( 거칠기 ) 라는 항을 통해 diffuse 와 specular 성분을 조정하게 됩니다. 물리에 기반한 개념이므로 아티스트가 처음에 이해하기는 어렵습니다. 하지만 그 값들은 매우 명확한 물리적 의미를 가지고 있기 때문에 전체적인 통일성을 높일 수 있으며, 값들을 ( 라이팅 종류에 따라 ) 건별로 조정할 필요가 없기 때문에 작업 생산성이 증가하게 됩니다.

그러므로 PBR 이 휘도를 계산하는 데 있어 배경으로 깔고 있는 개념들에 대해서 적절히 이해하는 것이 올바른 재질을 설정하는 데 있어 도움이 될 것 이라 생각합니다. 보통 PBR 을 처음 접하시는 분들이 diffuse map 에 그린대로 결과가 나오지 않는다는 이야기를 많이 하시는데, 이것은 diffuse 와 specular 가 어떤 식으로 반영되고 있는지를 이해하지 못하고 있기 때문에 나올 수 밖에 없는 질문이며, 매우 당연한 질문입니다.

휘도를 다루는 데 있어 반사의 성질 및 구성요소를 이해하는 것은 매우 중요합니다. 그런데 첨부터 에너지 보존법칙이니 metalicity 니 roughness 니 하는 것들을 이야기하는 것은 잘 와닿지도 않고 어려울 수 있습니다. 그래서 이러한 개념에 대해서 쉽게 설명하고 있는 John Hable 의 글을 두 개 번역하기로 했습니다. 오늘은 첫 번째 주제인 "Everything is Shiny" 입니다.


[ PBR 이란 무엇인가 ] 14. [ 번역 ]모든 것은 빛납니다

가끔씩 필자는 초심자용 온라인 문서나 논문에서 specular 에 대해서 언급하는 것을 보게 됩니다. 그리고 "옷이나 판지( cardboard )와 같은 일부 재질들은 스펙큘러를 가지지 않는 순수한 diffuse surface 들입니다" 라는 줄을 보게 됩니다. 이는 거짓말입니다. 실세계에 존재하는 모든 물체는 specular 를 가지고 있습니다. 심지어는 매우 오래된 옷이나 판지라도 specular 를 가집니다. 이것을 집에서 만든 편광 설정을 통해서 이를 확인했습니다. 편광 필터를 수작업으로 만들고 있었기 때문에, 여기에서 보여주는 구분이 완벽하지는 않습니다만, 충분히 잘 동작하는 것으로 보입니다.

먼저, 면직물 셔츠로 시작할 것입니다. 이는 필자가 구할 수 있는 가장 diffuse 한 것입니다. 거의 대부분의 면직물 셔츠들은 더 많은 specular 를 가지고 있습니다.

 Main:

 

 Diffuse:

 

 Specular:

 

이제 어떤 데님( 역주 : 청바니 만들 때 쓰는 푸른색 질긴 면직면. 출처 : 네이버 사전 )을 살펴 봅시다. 좀 더 빛나는 옷 재질입니다.

 Main:

 

 Diffuse:

 

 Specular:

 

다음으로 어떤 판지를 살펴 봅시다. 엡! 그것은 빛납니다.

 Main:

 

 Diffuse:

 

 Specular:

 

비교를 위해서, 여기에 내 팔레트중 하나를 가지고 왔습니다. Specular highlight 가 매우 밝습니다.

 Main:

 

 Diffuse:

 

 Specular:

 

여기에 몇 가지 다른 것들이 있습니다. 벽돌이 얼마나 많은 specular 를 가지고 있는지를 확인해 보세요.

 Main:

 

 Diffuse:

 

 Specular

 

마지막으로 보도에 깔린 콘크리트 조각이 있습니다. 보도의 콘크리트는 포장도로보다는 덜 빛납니다.

 Main :

 

 Diffuse:

 

 Specular:

 

 

+ Recent posts