빛의 감쇠 계산
빛의 감쇠를 계산하는 방법
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 |