Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 根据强度计算灯光体积半径_Opengl_Glsl_Light_Deferred Rendering_Deferred Shading - Fatal编程技术网

Opengl 根据强度计算灯光体积半径

Opengl 根据强度计算灯光体积半径,opengl,glsl,light,deferred-rendering,deferred-shading,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+fallo

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

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

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)));
然后使用此值缩放长方体

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

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)));
所以很明显我在搞数学。衰减应该是线性的,对吗?但是现在如何正确计算灯光体积的“世界比例”值


另外,灯光颜色可以超过(1,1,1),因为我计划使用HDR渲染。

不使用该等式,灯光将永远持续

plot 1.0/(1+5*(x*x))
www.wolframalpha.com:

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

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

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

其中
f
是您的
衰减
。对于
f=5
,有效半径为~7

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


这里还讨论了这个问题:,其中函数在阈值处调整为零。

不使用该等式,灯光将永远亮起

plot 1.0/(1+5*(x*x))
www.wolframalpha.com:

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

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

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

其中
f
是您的
衰减
。对于
f=5
,有效半径为~7

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


这里还讨论了这个问题:,其中函数在阈值处调整为零。

线性?不,这是二次的,你可以马上知道,因为它是基于距离平方的。线性的?不。这是二次的,你可以马上知道,因为它是基于距离平方的。我现在这样计算半径:
radius=sqrt(colMaxVal*254)/sqrt(LIGHT\u cutoff\u默认值)我觉得它看起来很正确。但现在我有另一个问题:我允许HDR的光照值高于1.0,这对吗?有了这个衰减函数,我需要相当高的光照值来照亮更大的区域。我假设要解决这个问题,我必须使用另一个?但这一条在我看来非常正确…@C0dR在这里找到了一个相关的帖子:。要使延迟渲染有效,您希望保持半径较小,但对于二次衰减,大多数计算仅用于小的添加。由于这个原因,您可能需要一个更渐进的衰减,添加一个线性组件。我现在这样计算半径:
radius=sqrt(colMaxVal*254)/sqrt(LIGHT\u cutoff\u默认值)我觉得它看起来很正确。但现在我有另一个问题:我允许HDR的光照值高于1.0,这对吗?有了这个衰减函数,我需要相当高的光照值来照亮更大的区域。我假设要解决这个问题,我必须使用另一个?但这一条在我看来非常正确…@C0dR在这里找到了一个相关的帖子:。要使延迟渲染有效,您希望保持半径较小,但对于二次衰减,大多数计算仅用于小的添加。出于这个原因,您可能需要一个更加渐进的衰减,添加一个线性组件。