2014-11-24 53 views
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))); 

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

P.S.由于我打算使用HDR渲染,所以光色可以超出(1,1,1)。

+0

线性?不是。那是二次方的,你可以立即知道它是基于距离平方的。 – 2014-11-24 00:20:58

回答

4

不使用该等式,光线会永远持续下去。

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

[编辑]因为你的光的颜色值可以去上面一个,下面的1/255将需要由最大的RGB分量来划分。

您将需要一个阈值。假设你的显示器无法显示任何内容比以前1/255黑色调光器,

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

enter image description here

哪里f是你falloff。对于f = 5,有效半径约为7。

enter image description here

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

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

+0

我现在计算半径如下:'radius = sqrt(colMaxVal * 254)/ sqrt(LIGHT_CUTTOFF_DEFAULT);'它对我来说看起来是正确的。但现在我有另一个问题:我的事件是否正确,我允许光照值高于1.0的HDR?有了这个衰减功能,我需要相当高的光线值才能让更大的区域亮起。我假设解决这个问题,我必须使用另一个?但是这个看起来对我来说是相当正确的... – C0dR 2014-11-24 14:18:04

+1

@ C0dR在这里找到了一个相关的帖子:http://gamedev.stackexchange.com/questions/21057/does-the-linear-attenuation-component-in-lighting-models - 具备-A-物理柜台。为了使延迟渲染效率更高,您希望保持半径较小,但是使用二次衰减时,大部分计算仅用于小增加。出于这个原因,您可能需要更渐进的衰减,添加一个线性组件。 – jozxyqk 2014-11-24 15:18:36