opengl - 使用 GL_FRAMEBUFFER_SRGB 进行 OpenGL 伽马校正
问题描述
我正在编写 Blinn Phong(LearnOpenGL 教程)照明并尝试将经过伽马校正的颜色作为最终结果。
在我开始研究伽玛校正之前,我的照明看起来像这样:
然后我整天都在阅读有关 sRgb 颜色空间的内容,以及它的含义。我得出的结论是,经过伽马校正的颜色可以带来更好的照明质量。
我不想在片段着色器中手动调整伽玛。我可以通过启用 GL_FRAMEBUFFER_SRGB 并请求支持 sRgb 的帧缓冲区来让 opengl 做到这一点。(?)
这是启用 GL_FRAMEBUFFER_SRGB 和以 GL_RGB 格式加载的纹理:
这是预期的结果。颜色更亮,因为采样的纹理经过了两次颜色校正。(?)
这是启用 GL_FRAMEBUFFER_SRGB 和以 GL_SRGB 格式加载的纹理:
这是意想不到的结果。一切都太暗了,没有可见的漫反射颜色,只有镜面反射。
我的问题是:
为了让opengl自己做伽玛校正(根据LearnOpenGL教程),我需要:
• 具有支持 SRGB 的帧缓冲区;
• 加载带有 SRGB 标志的纹理;
我做错了什么,或者我错过了一些重要的事情?
更新:漫反射纹理以 GL_SRGB 格式加载,而镜面反射以 GL_RGB 格式加载。在上一张图像中,漫反射颜色似乎完全衰减(?),而镜面反射按预期采样。我的衰减函数是:
float attenuation = max(1.0 - distance / light.radius, 0.0);
解决方案
推荐阅读
- python - 如何使用 Jupyter Notebooks 进行打印
- android - 使用 NavDeepLinkBuilder 构建片段回栈
- html - 模型查看器大纲
- c# - 将自定义 HttpResponseMessage 作为 IActionResult 返回
- github - github是否限制每个用户的个人访问令牌数量
- c - c中的简单字符串修改程序
- mysql - 来自多个mysql表的数据到一个xml
- logstash - Logstash 离线插件 SocketError
- vb.net - 如何显示像 Visual Studio 工具提示这样的枚举?
- ios - 如何根据类型替换/更新字典数组中的字典