【发布时间】:2017-11-10 14:14:28
【问题描述】:
我想在我的 OpenGL 3D 渲染器上实现 gamma 校正,我知道它与 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 值着色时。在这种情况下,我是否必须在线性空间中转换我的颜色,然后在光照操作之后,像我对纹理所做的那样转换回伽马空间?
这适用于我的灯是彩色的吗?
【问题讨论】:
-
如果您使用的是非古代硬件,硬件可以为您进行转换(从纹理读取和写入帧缓冲区)。它不仅更快,而且更正确(纹理过滤将正确完成。另外,sRGB 转换比 pow 稍微复杂一点)。关于您的问题:这取决于您的颜色所在的颜色空间。如果它们是 sRGB,那么您必须进行转换。
标签: c++ opengl shader fragment-shader