0

我目前在计算延迟渲染器的光体积半径时遇到问题。在低光强度下,体积大小看起来是正确的,但是当光强度(以及因此半径)增加时,光体积似乎越来越小。

我正在计算光体积半径(在世界空间中),如下所示:

const float LIGHT_CUTOFF_DEFAULT = 50;
mRadius = sqrt(color.length() * LIGHT_CUTOFF_DEFAULT);

然后我使用这个值来缩放一个盒子。

然后在我的着色器中计算衰减,如下所示:

float falloff = 5;
float attenuation = max(0, 1.0 / (1+falloff*(distance*distance)));

所以很明显我在搞乱数学。衰减应该是线性的,对吧?但是我现在如何正确计算光量的世界比例值?

PS,因为我打算使用 HDR 渲染,所以灯光颜色可以超过 (1,1,1)。

4

1 回答 1

4

不使用该等式,光会永远存在。

plot 1.0 / (1+5*(x*x))在 wolframalpha.com: 在此处输入图像描述

[编辑] 由于您的光色值可以高于 1,因此需要将以下 1/255 除以最大的 RGB 分量。

你需要一个门槛。假设你的显示器在黑色之前不能显示任何比 1/255 更暗的东西,

solve 1.0 / (1+f*(x*x)) = 1/255, x

在此处输入图像描述

ffalloff. 对于f = 5,有效半径约为 7。

在此处输入图像描述

1/255根据您的应用程序,您可能会增加一点,并且您可能不会注意到任何严重错误。或者,捏造一个不是无限的人工衰减函数:)

此处还讨论了此问题:https ://gamedev.stackexchange.com/questions/51291/deferred-rendering-and-point-light-radius ,其中函数被调整为在阈值处达到零。

于 2014-11-24T06:11:05.370 回答