빛의 감쇠 계산

반응형

빛의 감쇠를 계산하는 방법

1. 기본적인 방법.

점광원으로부터 방출되어서 하나의 표면을 떄리는 에너지는 

표면과의 거리가 멀어짐에 따라 감소한다.

간단하게 func(Attenuation) = 1/d(L) 을 사용하기도 하는데 이보다는 

제곱을 사용하는것이 결과물이 더 좋다.

func(Attenuation) = 1 / (d(L) * d(L))

그런데 테스트 해 보면 알 수 있지만 이 공식의 문제는 가까울 때에는 너무 선명하고 

멀어질 수록 너무 극명하게 약해진다는 것이다.

그래서 Direct3D에서 점광의 감쇠는 아래의 공식을 사용한다.

func(Attenuation) = 1 / ( A(0) + A(1) * d(L) + A(2) * d(L) * d(L) )

여기서 A0,1,2는 감쇠 상수이다.

A1 = 0, A2>0이면 방사성 거리 감쇠(radial distance falloff)가 되고

A1>0, A2 = 0이면 선형 감쇠(linear falloff)가 된다.

빛의 감쇠는 두가지를 신경써야 한다.

광원이 표면과 너무 가까이 있을때, 빛이표면에 영향을 주는 최대 범위의 경계에서

빛이 없다가 갑자기 나타나게 되는 경우이다.

너무 가까울 떄 빛이 너무 밝아지는 것을 막기 위해 A0을 1 이상으로 설정한다.

그리고 최대범위에서 갑자기 빛이 나타나는 것을 막기 위해 범위 경계에서 

감쇠계수가 0.0에 가깝게 되도록 감쇠 상수들을 설정하는 것이다.


2. 빛이 놓여있는 가상 영역을 사용하는 방법

float attenuation = saturate(1.0f - length(lightPos-worldPos.xyz)) / lightRange);
여기서 추가적으로 pow( attenuation, 상수 k) 로 감쇠 정도를 조절해주면 좋을 듯.

참고





'Study > Graphics ' 카테고리의 다른 글

9콘 필터 샘플링  (0) 2012.01.26
Ambient Aperture Lighting  (0) 2011.07.14
조명효과 - 램버트 확산 조명  (0) 2011.05.05
PartialPrecision  (0) 2011.04.21
Gemetric Modeling Systems  (0) 2010.11.27
TAGS.

Comments