纯色的 OpenGL 着色器伽玛

OpenGL shader gamma on solid color

我想在我的 OpenGL 3D 渲染器上实施伽马校正,我知道它与加载到 sRGB 中的纹理绝对相关,所以我这样做:

vec4 texColor;
texColor = texture(src_tex_unit0, texCoordVarying);
texColor = vec4(pow(texColor.rgb,vec3(2.2)),1.0);
vec4 colorPreGamma = texColor * (vec4(ambient,1.0) + vec4(diffuse,1.0));
fragColor =  vec4(pow(colorPreGamma.rgb, vec3(1.0/gamma)),1.0);

但我的问题是关于纯色的,当我想要点亮的 3D 对象的表面没有纹理,而只是由每个顶点的 RGB 值着色时。在这种情况下,我是否必须在线性 space 中变换我的颜色,并在光照操作之后,像我对纹理所做的那样变换回 gamma space?

这适用于我的灯是彩色的吗?

In this case, do I have to transform my color in Linear space, and after the lighting operation, transform back to gamma space like I do for a texture?

这取决于:您使用的颜色是什么颜色空间?

你不做这个更正是因为它们来自哪里;你这样做是因为颜色实际上是什么。如果该值不是线性的,那么无论它来自哪里,都必须在使用之前对其进行线性化处理。

你最终要负责把那个颜色放在那里。因此,您必须知道该颜色是线性 RGB 还是 sRGB 色彩空间。如果颜色不是线性的,那么你必须先将它线性化,然后才能从中得到有意义的数字。

在 OpenGL 中,颜色数据和其他类型的数据之间并没有太大区别:如果您有 vec3,您可以通过 .xyz.rgb 访问组件。都是数据。

所以问问自己:"Do I have to gamma correct my vertex positions in the vertex shader?"

当然不是,因为你的顶点位置已经线性space。因此,如果您类似地以线性 space 设置顶点颜色,则同样不需要伽玛校正。

换句话说,您是否将 vec3(0.5, 0.5, 0.5) 想象成 视觉上 介于黑白之间的灰色?然后你需要伽马校正。

您认为它数学上介于黑白之间(就可测量的光强度而言)吗?那么它已经是线性的了。