我目前在计算延迟渲染器的光量半径时遇到问题。在低光强度下,体积大小看起来是正确的,但是当光强度(因此半径)增加时,光量似乎越来越小。
我正在计算光量半径(在世界空间中),如下所示:
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)。
答案 0 :(得分:4)
不使用那个等式,光会永远持续下去。
plot 1.0 / (1+5*(x*x))
在wolframalpha.com:
[ EDIT ]由于您的浅色值可以高于1,因此需要将以下1/255除以最大的RGB分量。
你需要一个门槛。假设您的显示器在黑色之前无法显示比1/255更暗的任何内容,
solve 1.0 / (1+f*(x*x)) = 1/255, x
f
是falloff
。对于f = 5
,有效半径为~7。
根据您的应用程序,您可能会稍微增加1/255
,您可能不会发现任何严重错误。或者,捏造一种非无限的人工衰减函数:)
此处还讨论了这个问题:https://gamedev.stackexchange.com/questions/51291/deferred-rendering-and-point-light-radius,其中函数被调整为在阈值处达到零。