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

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

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

원문 : 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 컬러 체커를 확인해 봅시다. 컬러 체커를 사용할 때, 여러분은 카메라로부터 수직으로 그것을 배치하는 것이 좋습니다. 왜 그렇게 해야 하는지 저에게 물어볼 필요가 없어졌으면 좋겠군요.

프레넬 만세!

+ Recent posts