Glsl gl_FragColor值是否应标准化?

Glsl gl_FragColor值是否应标准化?,glsl,shader,normalization,lighting,phong,Glsl,Shader,Normalization,Lighting,Phong,我正在编写一个Phong lighting着色器,我很难决定传递给gl\u FragColor的值是否应该标准化 如果我使用标准化的值,灯光会有点奇怪。例如,远离光源(未照亮)的对象的颜色由发射光组件、环境光组件和全局环境光的总和决定。让我们假设这加起来就是(0.3,0.3,0.3)。正常情况下,这大约是(0.57,0.57,0.57),这比我预期的要亮得多 但是,如果我使用非规范化值,对于接近的对象,反射区域会变得非常非常明亮,我必须确保我的材质常数通常使用较低的值 请注意,我仅规范化RGB分

我正在编写一个Phong lighting着色器,我很难决定传递给
gl\u FragColor
的值是否应该标准化

如果我使用标准化的值,灯光会有点奇怪。例如,远离光源(未照亮)的对象的颜色由发射光组件、环境光组件和全局环境光的总和决定。让我们假设这加起来就是
(0.3,0.3,0.3)
。正常情况下,这大约是
(0.57,0.57,0.57)
,这比我预期的要亮得多

但是,如果我使用非规范化值,对于接近的对象,反射区域会变得非常非常明亮,我必须确保我的材质常数通常使用较低的值

请注意,我仅规范化RGB分量,而alpha分量始终为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)
。如果对场景中的所有材质和所有灯光使用一致的值,则通过对计算出的颜色值进行简单划分可以获得相同的结果,但这有点过分,因为场景可能太暗



更复杂但外观更好的解决方案涉及到曝光和滤镜,例如获得更逼真的照片图像。这基本上意味着将场景渲染到一个浮动缓冲区中,该缓冲区可以处理比RGB缓冲区更大的范围,然后模拟相机或人眼适应特定光照强度的行为以及由此机制(即bloom)产生的图像伪影。

谢谢,我怀疑没有确定的点火方式,目前降低材料常数/光强度似乎是我最好、最简单的选择。