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


[ PBR 이란 무엇인가 ] 8. Attenuation Radius 설정

거리 감쇠

3. 빛의 감쇠 ] 에서는 빛의 감쇠가 1 / dist2 으로 이루어진다고 했습니다. 하지만 실질적으로 컴퓨터 프로그램에서는 그런 식을 사용할 수 없습니다. 왜일까요?

dist = 0 인 상황이라면 결과가 1 / 0 이 됩니다. 그러면 컴퓨터는 이를 inf( 무한대, infinity ) 라고 평가하게 됩니다. 그래서 보통은 기본 감쇠 공식은 거리가 0 이 될 수 없다고 가정하고 계산을 하게 됩니다. 게다가 가장 가까울 때의 빛이 원래 빛의 밝기보다 밝아서는 안 되는 원칙( 에너지 보존 법칙 )도 지켜줘야겠죠.

그래서 UE4 에서는 거리 감쇠를 위해 식1 을 사용합니다.

식1. UE4 에서의 거리 감쇠 공식.

DistanceBias 라는 것이 갑자기 튀어 나와서 놀라셨겠지만, 이것은 쉐이더에서 그냥 1 로 정해져 있습니다.

식만 봐서는 잘 모르겠죠? 이를 그래프로 보면 그림1 과 같습니다.

 

그림1. 1 / dist2 과 1 / ( dist2 + 12 ) 의 비교. 거리( x 값 )가 0 이 되면 파란 그래프는 최대값이 1 이 됩니다.

하지만 여전히 이 감쇠 그래프는 문제점을 가지고 있습니다. x 값이 엄청나게 커져도 0 이 되질 않습니다. 즉 빛은 그 세기가 다를뿐 무한대의 거리까지 퍼져나간다는 의미입니다.

감쇠 반경 마스크

대부분의 엔진들에서 광원들은 "Attenuation Radius" 라는 속성을 가지고 있습니다. 이는 광원이 영향을 미치는 거리를 강제로 줄여버리는 역할을 합니다.

그림2. UE4 의 Attenuation Radius 속성. Source Radius 는 area light 의 속성입니다. 

왜 이런 일을 할까요? 사실 이유는 별게 아닙니다. 컴퓨팅 파워가 부족하기 때문입니다.

그림3 을 보시면 어느 정도 거리가 멀어지면 빛의 거의 영향을 미치지 못하는 것을 볼 수 있습니다.

그림3. 눈으로 보면 일정 거리 이상에 빛이 닿지 않는 것처럼 보입니다. 하지만 사실은 그림1 에서 확인할 수 있듯이 매우 약한 빛이 닿고 있는 것이죠.

씬 내에는 수 백개 많으면 수 천개의 광원이 존재할 수 있는데, 이를 모두 계산하기에는 비용이 너무 비쌉니다. 그래서 특정 광원이 미치는 범위를 조절하게 됩니다. 그것이 바로 감쇠 반경( Attenuation Radius )인 것이죠. 이를 UE4 에서는 내부적으로 "Light Radius Mask" 라고 부릅니다.

이는 식2 와 같이 계산됩니다.

식2. LightRadiusMask 공식.

식이 어렵죠? 이해하시려고 노력하실 필요는 없습니다. 저도 잘 이해가 안 갑니다. 여기에서 saturate() 라는 함수는 0 보다 작은 값은 0 으로, 1 보다 큰 값은 1 로 잘라주는 함수입니다.

어쨌든 그래프로 느낌만 이해하면 됩니다. 예를 들어 Radius 가 1 인 경우와 2 인 경우를 살펴 봅시다. 그럼 그래프는 그림4 와 같은 모양을 가집니다.

그림4. LightRadiusMask 그래프. Radius 가 1 이면 Dist 가 1 이 넘어갈 때 밝기가 0 이 되고, Radius 가 2 이면 Distance 가 2 가 넘어갈 때 밝기가 0 이 됩니다.

거리 감쇠와 감쇠 반경의 결합

이제 위에서 언급한 두 개의 식( 식1식2 )을 곱한 것이 최종 감쇠 공식입니다.

식3. 최종 감쇠 공식.

식을 봐봐야 머리만 아프니 그래프를 살펴 보죠. 이것의 형태는 그림5 와 같습니다. 그래프의 차이를 좀 더 명확하게 보기 위해서 빛의 밝기를 10 이라고 가정했습니다.

그림5. 빛의 밝기가 10 일 때 최종 감쇠 그래프.

여러분은 그림5 를 보면서 Radius 가 크면 클수록 Attenuation Radius 를 적용하지 않은 원래의 감쇠 공식과 비슷해진다는 것을 알 수 있을 겁니다. 그러므로 과도하게 적은 Radius 를 잡으면 감쇠가 이상한 형태로 나오는 결과를 산출하게 됩니다.

+ Recent posts