不。标准化颜色会产生有趣的效果,但我认为你并不是最想要它,如果不是所有时间的话。
颜色输出的标准化会导致信息丢失,即使在某些情况下它似乎为场景提供了更多细节。如果所有片段的颜色都已标准化,则意味着所有 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缓冲区更大的范围,然后模拟相机或人眼适应某种光强度的行为以及由此机制引起的图像伪影(即绽放)。