【发布时间】:2021-10-08 14:46:01
【问题描述】:
我正在像这样使用 OpenGL 加载纹理
glTexImage2D(
GL_TEXTURE_2D,
0,
GL_RGBA,
texture.width,
texture.height,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
texture.pixels.data());
问题是图像的颜色与我在系统图像查看器上打开文件时看到的颜色不同。
在屏幕截图中,您可以看到系统图像查看器上显示的面部黄色颜色为 #FEDE57,但在 OpenGL 窗口中显示的是 #FEE262强>
我可以使用任何标志或格式来匹配相同的颜色校准吗?
将相同的图像显示为 Vulkan 纹理看起来不错,因此我可以放弃加载图像数据的方式没有问题。
【问题讨论】:
-
可能是gamma?
-
我在纹理的内部格式中尝试了
glEnable(GL_FRAMEBUFFER_SRGB);和GL_SRGB8_ALPHA8,得到了相同的结果 -
伽玛校正不会自动完成。您需要在读取图像时或在着色器中根据图像信息中存储的伽马值进行校正。
-
@t.niese 我该怎么做?
-
在不知道您如何将数据读取到
texture.pixels'(从文件中检索图像数据的整个过程)的情况下,无法判断您是否在那里做错了。并且GL_SRGB8_ALPHA8仅应在您从图像中读取的数据位于 SRGB 颜色空间中时使用。使用glEnable(GL_FRAMEBUFFER_SRGB)并不意味着您必须使用GL_SRGB8_ALPHA8。内部格式只是说明纹理数据的格式,以便 OpenGL 可以正确地将其从 sRGB 转换为着色器中的线性颜色空间。