纯色的 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)
想象成 视觉上 介于黑白之间的灰色?然后你需要伽马校正。
您认为它数学上介于黑白之间(就可测量的光强度而言)吗?那么它已经是线性的了。
我想在我的 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)
想象成 视觉上 介于黑白之间的灰色?然后你需要伽马校正。
您认为它数学上介于黑白之间(就可测量的光强度而言)吗?那么它已经是线性的了。