从强度计算光量半径

时间:2014-11-24 00:17:32

标签: opengl glsl light deferred-rendering deferred-shading

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

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

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)));

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

P.S。因为我计划使用HDR渲染,所以浅色可以超越(1,1,1)。

1 个答案:

答案 0 :(得分:4)

不使用那个等式,光会永远持续下去。

plot 1.0 / (1+5*(x*x))在wolframalpha.com: enter image description here

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

你需要一个门槛。假设您的显示器在黑色之前无法显示比1/255更暗的任何内容,

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

enter image description here

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

enter image description here

根据您的应用程序,您可能会稍微增加1/255,您可能不会发现任何严重错误。或者,捏造一种非无限的人工衰减函数:)

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