게임/게임 물리

람베르트 반사식!

허브포트 2019. 12. 17. 23:19

컴퓨터 그래픽에서 사용되는 원리(람베르트 코사인 법칙)를 말하기 전에 람베르트 반사에대해 설명하겠습니다!

 

램버시안 반사율(Lambertian reflectance)을 갖는 표면은, 관찰자가 바라보는 각도와 관계없이 같은 겉보기 밝기를 갖습니다.

거친 표면을 가진 모든 물질이 램버시안 반사율을 갖지는 않지만, 표면의 특징에 대해 잘 모를때 램버시안 반사는 적당한 근사치가 될 수 있습니다.

 

 

 

람베르트의 코싸인 법칙의 그림입니다. 입사되는 각도에 따라 반사되는 광량이 변화합니다.
0도 (수직)입사의 경우 100%라면, 30도 입사의 경우 87%, 60도 입사의 경우 50%, 85도의 경우 9%가 됩니다.

 

 

 

 

 

"어? 어떻게 해야 저런 값이 나오지? 입사각만 주었는데 광량이 나오다니!!"

 

 

 

위의 식을 사용하면 됩니다

내용이 조금더 궁금하다면 https://en.wikipedia.org/wiki/Lambert's_cosine_law 
이곳을 참고!

 

 

 

이제 직접 그래픽으로 들어가 볼게요

 

 

 

 

면에 수직인 법선 벡터를 생각해 봅시다.

 

법선 벡터가 정확히 광원쪽을 향하면 밝기가 최대가 됩니다

법선 벡터가 광원에 PI/2(90)도 이면 밝기가 최소가 됩니다.
(컴퓨터에서는 각도를 표시할때 호도법을 주로 사용한다)

PI/2 그 뒤의 면은 닿지 않습니다. 즉 법선벡터가 광원에 PI/2  이상이면 밝기가 최소가 될 것입니다.  

 

이 말은 우리는 법선벡터의 각도가 PI/2 이상일때는 계산을 할 필요가 없다는 것입니다.

즉 0 ~ PI/2(90도) 일때만 계산하면 됩니다

 

법선 벡터에 대해 여기서 잠시 설명 할게요!
위의 그림 1-3-3을 보면 면위에 벡터가 있습니다. 각도는 직각으로 표시 되어있습니다.

 

 

 

 

 

이제 람베르트 반사식으로 들어가 봅시다

 

 

 

 

환경광 I0외에 직사광 I1 dot cos(theta)가 더해졌습니다.
이것이 람베르트 반사의 본체입니다. 

우리는 각도를 구할 필요가 없이 그저 cos(theta) 가 필요합니다.

 

(앞을보면 2차원을 다루는 것 같지만 전혀 그렇지 않습니다. 위의 함수의 기울기는 그저 2차원에서 저렇게 하면 된다는 것입니다. 즉 우리는 3차원 구에대해서 다룰 것입니다.)

 

 

 

 

 

 

 

cos(theta)는 벡터의 내적으로 구할 수 있습니다.

즉 cos(theta) = a•b / |a||b| = (axbx + ayby + azbz)/|a||b|  로 코사인의 값을 구할 수 있습니다.

 

참고로 벡터 a 에서 |a|는 벡터의 길이를 의미하는 것입니다
a = (x,y,z)라고 하였을때. |a| = 루트(x*x + y*y + z*z)라는 식을 세워 구하면 됩니다.

 

광원 방향과 면의 법선 벡터 cos(theta)를 구할때 광원 뱡향의 단위 벡터를

 

 

,
면의 단위 법선 벡터(길이가 1인 법선 벡터)를

 

 


 

 

즉 벡터의 내적으로 이런식을 세워서 cos(theta)를 구할 수 있습니다

 

 

 

 

그래서 cos(theta)를 람베르트 반사식에 대입하여 빛의 밝기를 구할수 있습니다.

여기서 L 벡터는 광원의 방향을 결정하는 벡터이므로(광원의 방향은 주어진다)

단위 법선 벡터인 n 벡터만 구하면 됩니다.

 

법선 벡터를 구하는 방법!

 

 

 

이를 보아라 굳이 힘들게 미분까지 해가면서 단위 법선 벡터를 구하지 않아도 됩니다

 

이 말은 벡터안의 각 스칼라 값 x,y,z 를 반지름으로 나누라는 것이죠.