首页 > 解决方案 > 使用 GL_FRAMEBUFFER_SRGB 进行 OpenGL 伽马校正

问题描述

我正在编写 Blinn Phong(LearnOpenGL 教程)照明并尝试将经过伽马校正的颜色作为最终结果。

在我开始研究伽玛校正之前,我的照明看起来像这样:

图 1

然后我整天都在阅读有关 sRgb 颜色空间的内容,以及它的含义。我得出的结论是,经过伽马校正的颜色可以带来更好的照明质量。

我不想在片段着色器中手动调整伽玛。我可以通过启用 GL_FRAMEBUFFER_SRGB 并请求支持 sRgb 的帧缓冲区来让 opengl 做到这一点。(?)

这是启用 GL_FRAMEBUFFER_SRGB 和以 GL_RGB 格式加载的纹理:

图 2

这是预期的结果。颜色更亮,因为采样的纹理经过了两次颜色校正。(?)

这是启用 GL_FRAMEBUFFER_SRGB 和以 GL_SRGB 格式加载的纹理:

图 3 这是意想不到的结果。一切都太暗了,没有可见的漫反射颜色,只有镜面反射。

我的问题是:

为了让opengl自己做伽玛校正(根据LearnOpenGL教程),我需要:

• 具有支持 SRGB 的帧缓冲区;

• 加载带有 SRGB 标志的纹理;

我做错了什么,或者我错过了一些重要的事情?

更新:漫反射纹理以 GL_SRGB 格式加载,而镜面反射以 GL_RGB 格式加载。在上一张图像中,漫反射颜色似乎完全衰减(?),而镜面反射按预期采样。我的衰减函数是:

float attenuation = max(1.0 - distance / light.radius, 0.0);

标签: openglgammasrgbphong

解决方案


推荐阅读