2

我正在编写一个 Phong 光照着色器,我很难决定是否gl_FragColor应该对传递给的值进行归一化。

如果我使用标准化值,照明有点奇怪。例如,远离光源(未点亮)的对象的颜色将由发射分量、环境分量和全局环境光的总和确定。让我们说加起来(0.3, 0.3, 0.3)。正常情况下大致是(0.57, 0.57, 0.57),这比我预期的要亮得多。

但是,如果我使用非归一化值,对于近距离物体,镜面反射区域会变得非常非常明亮,我必须确保我的材质常数通常使用低值。

请注意,我只对 RGB 分量进行归一化,而 alpha 分量始终为 1。

我有点不知所措,找不到与此相关的任何内容。无论是那个还是我的搜索都是完全错误的。

4

1 回答 1

1

不。标准化颜色会产生有趣的效果,但我认为你并不是最想要它,如果不是所有时间的话。

颜色输出的标准化会导致信息丢失,即使在某些情况下它似乎为场景提供了更多细节。如果所有片段的颜色都已标准化,则意味着所有 RGB 向量的范数都等于1. 这意味着有些颜色在您的输出中根本不存在norm = sqrt(3)norm = sqrt(2)白色norm(0.5, 0.0, 0.0) = 0.5( .

另一种理解颜色归一化为什么错误的方法是考虑渲染灰度图像的不太普遍的情况。由于只有一个颜色分量,归一化根本没有任何意义,因为它会使你的所有颜色1.0


使用未经归一化的值的问题源于您的输出图像必须将其颜色值限制在固定间隔:[0, 255][0.0, 1.0]. 由于对象的镜面反射部分比仅反射漫射光的部分反射更多的光,因此计算的颜色值很可能会超过(1.0, 1.0, 1.0)大部分镜面反射区域并被钳制为白色,因此这些区域可能会变得太亮。

一个简单的解决方案是降低材料常数值或光强度。您可以更进一步,确保选择材料常数和光强度的值,以便计算的颜色值不会超过(1.0, 1.0, 1.0)。如果对场景中的所有材质和所有灯光使用一致的值,则可以通过计算颜色值的简单除法来实现相同的结果,但这有点矫枉过正,因为场景可能太暗了。


更复杂但更好看的解决方案涉及HDR 渲染和曝光滤镜(例如绽放),以获得更逼真的图像。这基本上意味着将场景渲染到一个浮动缓冲区中,该缓冲区可以处理比[0, 255]RGB缓冲区更大的范围,然后模拟相机或人眼适应某种光强度的行为以及由此机制引起的图像伪影(即绽放)。

于 2014-05-15T23:26:30.187 回答