纯色的OpenGL着色器伽玛

时间:2017-11-10 14:14:28

标签: c++ opengl shader fragment-shader

我想在我的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值着色。在这种情况下,我是否必须在线性空间中转换我的颜色,并且在灯光操作之后,像我对纹理一样转换回伽玛空间?

当我的灯光着色时,这是否适用?

2 个答案:

答案 0 :(得分:1)

  

在这种情况下,我是否必须在线性空间中转换我的颜色,并且在灯光操作之后,像我对纹理一样转换回伽玛空间?

这取决于:你的颜色是什么颜色空间?

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

你最终要把那种颜色放在那里。因此,您必须知道该颜色是否为线性RGB或sRGB颜色空间。如果颜色不是线性的,那么你必须先将其线性化,然后才能从中获得有意义的数字。

答案 1 :(得分:0)

在OpenGL中,颜色数据与其他类型的数据之间没有很大区别:如果您有vec3,则可以.xyz.rgb访问组件。它只是数据。

所以问问自己:"我是否需要在顶点着色器中对顶点位置进行伽马校正?"

当然不是,因为您的顶点位置已经在线性空间中。因此,如果您在线性空间中类似地设置顶点颜色,则不需要进行伽马校正。

换句话说,你认为vec3(0.5, 0.5, 0.5)是黑色和白色中间的视觉的灰色吗?然后你需要伽马校正。

你认为它是数学在黑白之间(就可测量的光强度而言)?然后它已经是线性的。