"Battlefield 3의 DirectX 11 렌더링"PowerPoint의 슬라이드 중 하나에서 다음 코드를 발견했습니다.
struct Light {
float3 pos; float sqrRadius;
float3 color; float invSqrRadius;
}
왜 반경을 저장하는 대신 왜 제곱 반지름과 심지어 제곱 반지름 (단순히 제곱 반지름이라고 생각하는지)을 저장해야하는지 이해할 수 없습니까? 그들은이 데이터를 어떻게 계산에 사용합니까? 또한 콘 및 라인 라이트는 어떻습니까? 이 구조체는 포인트 라이트 전용이어야합니다. 다른 유형에서는 작동하지 않습니다. 데이터가 충분하지 않습니다. 아직도 나는 그들이 그 광장과 invSquare를 어떻게 사용하는지 알고 싶습니다.
업데이트 : 네, 마침내 얻었습니다.
다음은 그물에서 쉽게 찾을 수있는 고전적인 광 감쇠 방정식입니다.
float3 lightVector = lightPosition - surfacePosition;
float attenuation = saturate(1 - length(lightVector)/lightRadius);
length(lightVector)
실제로이 작업을 수행하는 것처럼 상대적으로 비용이 많이 듭니다 .
length(lightVector) = sqrt(dot(lightVector, lightVector);
게다가, 분할 운영 (/lightRadius)
또한 상당히 비싸다.
이런 방식으로 빛 감쇠를 계산하는 대신 다음과 같은 방식으로 빛 감쇠를 계산할 수 있습니다.
attenuation = saturate(1 - dot(lightVector, lightVector)*invRadiusSqr);
여기서 invRadiusSqr은 CPU 레벨에서 사전 계산되어 쉐이더 상수로 전달 될 수 있습니다.
또한, 결과적으로 (이전의 경우 선형 대신) 2 차 광 감쇠가 발생하는데, IRL 광이 2 차 감쇠를 갖는 것으로보다 우수합니다.
도와 주셔서 감사합니다!