照明模型中的线性衰减分量是否具有物理对应物?


18

在OpenGL(和其他系统)中,点光源的距离衰减因子类似于1/(c+kd+sd^2),其中d距光源的距离为ck并且s为常数。

我了解对sd^2现实中预期的物理上精确的“反平方定律”衰减建模的组件。

我猜想常数c(通常为1)是否可以处理很小的值d(也许除以零防御?)。

线性kd组件在模型中起什么作用(k在OpenGL中默认为零)。什么时候使用其他值k?我知道这称为“线性衰减”分量,但是它在照明模型中模拟什么行为?在我所知的任何物理光模型中似乎都没有出现。

[编辑]

David Gouveia指出,线性因子可用于帮助使场景“看起来”更接近开发商/艺术家的意图,或更好地控制光线的散失率。在哪种情况下,我的问题变成“线性衰减因子是否具有物理上的对应关系?或者它只是用作帮助控制场景中的光质量的软糖因子?”


我并不是说线性衰减可以使场景看起来更好或更逼真。我说的是,它看起来可能更适合您的目的。我的光线追踪器照亮了一个很小的场景,当比较两个模型时,线性看起来更好。我并不需要身体上的理由说它看起来更好-它看起来更接近我想要达到的效果。相反,并不是平方反比定律看起来并不逼真,反而是它掉落得太快并且对场景照明的贡献比我所需的少。
David Gouveia

大卫,很抱歉,我不是要歪曲您的回答。我已经更改了上面的修改。
肯(Ken)

1
永远记住,所有的照明都是hack,纯粹而简单=)
Patrick Hughes

Answers:


21

来自点状光源的光与距离的平方成正比。那是物理现实。

通常认为线性衰减看起来更好。但这仅适用于非线性色彩空间。也就是说,如果您没有激活正确的伽马校正。原因很简单。

如果您将线性RGB值写入没有伽马校正的非线性显示器,那么您的线性值将被显示器的内置伽马斜率所破坏。与您的实际意图相比,这有效地使场景变暗

假设灰度系数为2.2,则显示器在显示它们时会将所有颜色有效地提高到2.2的幂。

这是线性衰减:1/kd。这是应用了监视器的伽玛斜率的线性衰减:1/(kd)^2.2。这与适当的反平方关系非常接近。

但是实际的平方反比1/sd^2变为:1/((s^2)(d^4.4))。这使光衰减下降的幅度比预期的要大得多

通常,如果您使用适当的伽玛校正(例如渲染到sRGB帧缓冲区),则不应使用线性衰减。它看起来不正确。完全没有。如果您不使用伽玛校正,那您怎么了?)

无论如何,如果您想模仿现实,则需要平方反比(并且伽玛正确)。如果不是,那么您可以为场景做任何需要做的事情。


4
+1我已经了解了一段时间的伽玛校正渲染。我知道二次和线性衰减已有一段时间了。这是我首先意识到两者之间的联系的那一刻。:-)
David Gouveia

-1是什么原因?
Nicol Bolas

9

灵活性强

因为您可能希望灯光线性下降。它可以为您提供这种程度的控制。它实际上并不需要物理上准确(并且整个phong阴影照明方程式当然也不是物理上准确的)。

有时,二次模型会在光源附近发出太快的光线,并在附近的表面留下“白色眩光”。通过提供线性和恒定系数,您可以灵活地根据自己的喜好调整结果

例如,当我实现光线追踪器时,我发现平方反比定律使我的点光源掉落的速度太快了。我改用线性模型(每个光源都有一个最小和最大半径,并且在它们之间进行线性插值),它看起来更好。

编辑:刚刚找到了一个不错的资源来解释这一点


6

好吧,我会猜一猜。

初步观察

在OpenGL(和其他系统)中,点光源的距离衰减因子类似于1/(c+kd+sd^2),其中d距光源的距离为ck并且s为常数。

我了解对sd^2现实中预期的物理上精确的“反平方定律”衰减建模的组件。

的曲线c+kd+sd^2是抛物线,的曲线也是如此sd^2。区别并不像看起来那样重要:它们在无限远时的行为类似,只是对于较小的值,它们是不同的。不管k是什么意思,它只有在接近光线时才有意义。

初步简化

由于这是一个衰减因子,因此您也可以在表达式中设置s == 1或除以每个常数s,然后将光源的功率除以s。公式中有一个参数太多。

您最终得到:

1/(c/s+(k/s)d+d^2)

变量变化

……严格等于:

1/(A + D^2)

A == c/s - k^2/(4s^2),更重要的是,D == d + k/2s

1/(A+D^2)真的像平常一样1/(c+d^2),不是吗?

结论

k因数增加或延迟了光衰减,因此它仅在半径为-k/2s(的情况下开始(是的,它也可以具有“负”半径,请考虑假想球面镜内部的假想点光,它只会第二次发光)。 。看来数学又赢了!

编辑:有一秒钟我以为它等效于球形光,但事实并非如此。最值得注意的是,它不会产生柔和的阴影。

有用吗?

我的猜测是,艺术家可以使用此参数使灯光看起来像在照明方面离对象更近(或更远),但不会移动。由于点光源会产生硬阴影,因此可能需要将光源保持在特定位置。


3

线性衰减系数是传播到介质中的光的物理对应物。没有衰减,光似乎在完美的空隙中传播。渲染“真实”场景时,您希望空气在整个距离上衰减光的强度,并且这种衰减是线性的。


我认为那不是真的。通过介质传播的光将被衰减1/dR坐标,仍然通过1/d^2thetaphi球面坐标。因此,您所描述的是1/d^3光强度的衰减。
sam hocevar 2011年

3

线性衰减因子是有,你可能想使用线性衰减为您的照明情况,但关键的是-你不具备使用它(或任何其它衰减因素,对于这个问题)。

这使您可以根据自己的个人喜好调节照明。因此,只需将您不希望的任何衰减因子设置为0,将您不希望的衰减因子设置为非0,就可以了。

您可能要使用线性衰减的一个特定示例是,如果数学上更正确的反平方提供的衰减太快。使用线性,您可以获得的效果看起来或多或少都足够好(并且场景中的灯光更少);因此您将使用0常数,1线性和0指数。

有趣的是(但与本次讨论无关),OpenGL和D3D中的点精灵(以及OpenGL中的点参数)使用相同的衰减公式。

还值得注意的是,OpenGL / D3D照明并非严格地旨在物理上正确;它从来没有被设计成可以接受的近似值,在查询任何与它的工作方式有关的东西时应该牢记这一点。

当然,如今您很可能会使用着色器,因此旧的光照公式仅主要在学术/历史方面感兴趣-您可以编写所需的任何光照公式。


1
  • c 是光源的恒定衰减值。
  • l是线性衰减。这就是为什么它乘以光源的距离。
  • s 是二次衰减,因此它乘以距离的平方。

此链接中有更多信息。


谢谢,但是我的问题是线性衰减组件在光建模中的作用是什么。我问是因为它没有出现在我所知的任何光物理模型中。您提供的链接没有说明线性衰减分量的用途。它只是说;“这是线性衰减”,没有任何其他解释。

好吧,我误解了你的问题。在无限的一维光源(例如荧光灯管)中,线性衰减会更好地观察到,而对球形光源的行为进行二次建模。到目前为止,我只发现一个地方可以解释物理光模型与计算机图形学之间的对应关系:imdoingitwrong.wordpress.com/2011/01/31/light-衰减
r2d2rigo 2011年

1

从实际上它的威力推导出Z,在尊敬的埃里克·伦盖尔的话

是非线性的,因为透视校正光栅化需要1 / z的线性插值-z的线性插值本身无法产生正确的结果。硬件必须在每个顶点上计算1 / z并将其插值到一个三角形上,因此,只需将该值写入深度缓冲区即可,而不是对每个像素执行昂贵的除法操作来恢复z都很方便。

您获得的z精度越接近于近平面,这一事实只是一个副作用,与1 / z插值背后的动机无关。

深度缓冲区存储距离。光使用距离进行衰减。可能需要深度缓冲区和照明实现之间的关系,尽管仅当照明算法在我假设的屏幕空间中运行时才适用。请记住,总要存储一个预先计算(或硬件计算)的逆数,而不是必须对需要它的每帧每个运算的未除数值进行除法...并且这往往是大量的运算。

这只是一个猜测。


您可能正在那里。它很可能与计算照明的空间有关。但是我不认为深度缓冲是其中的一部分,因为它存储了从眼睛(或前平面)到物体的“伪距离”,而不是从光线到物体的距离。是照明中使用的光距离。

@downvoter-想发表评论,还是只是拖钓?(引用乔纳森的话)
工程师

同样是下降投票,衰减是在眼睛空间而不是归一化空间中计算的->透视/ z与之无关
Oliver Zendel 2014年

1

就像一个附录:当使用openGL模型逼近球形光源时,所有这三个系数都是有意义且有效的(不是“防止溢出”或“具有艺术自由”):

对于半径为r的球体,我们得到:

1 /(d / r + 1)^ 2

这转化为

c = 1 k = 2 / r s =(1 / r ^ 2)

(请参阅http://imdoingitwrong.wordpress.com/2011/01/31/light-衰减/)。

恕我直言,这种近似比使用无限延伸的无限小点光源更好!


公式1 /(d / r + 1)^ 2怎么来?原始文章仅说“在查看了一系列测试的结果之后,它变得显而易见”,这在问物理建模的问题方面还不足以令人信服。
user1914692 '16

0

我对公式有不同的看法/答案。

例如,当我们查看聚光灯时,实际上我们看到的是光散射。因此,1 / d ^ 2的公式仅适用于该像素的发光。但是我们相机中该像素的亮度将具有更复杂的公式,该公式将使用光散射原理。见论文

“用于具有单散射的参与介质中的阴影和裂缝射线的远极采样”

作者:Carsten Dachsbacher的Thomas Engelhardt,但不幸的是,它们并没有最终的简单光散射公式。我猜想最终的GPU模仿效果可能类似于线性和二次公式。

所以我认为主张:

“如果您想模仿现实,您想求反平方(并且伽玛正确)”无效。

实际上,我使用具有线性和二次因子的公式,而没有伽马可以很好地模仿发光效果。线性不能。

总之,该公式具有光散射的物理对应关系。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.