繁体   English   中英

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

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

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

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

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

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

在OpenGL中,颜色数据和其他类型的数据之间没有太大的区别:如果你有一个vec3你可以访问.xyz.rgb组件。 这些都只是数据。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM