在我的渲染器中,我在一个多采样的FBO上产生一个反别名场景,这个场景被切割到一个颜色附件是纹理的FBO上。然后在呈现到帧缓冲区的过程中读取纹理。
我想要更新它,以便我得到伽马-正确的结果。使用sRGB框架缓冲区的好处是,它允许我直接将非线性sRGB值存储在帧缓冲区中,从而获得更好的颜色精度。
我不确定的是我应该做什么改变来获得这个,以及什么是被不同的设置所改变的。
看起来sRGB只是在处理读取和混合sRGB帧缓冲区的操作。在我的情况下,我需要使用一个指定sRGB表示类型的纹理,这意味着我将使用扩展sRGB.使用线性纹理格式将禁用sRGB转换。
编辑:但我刚看到这个:
3)支持sRGB帧缓冲区更新和混合的能力是否应该是框架缓冲区的一个属性? 决议:是的。它应该是一些像素格式(很可能只是RGB8和RGBA8)的一种功能,说明可以启用sRGB混合。 这允许实现简单地将现有的RGB8和RGBA8像素格式标记为支持sRGB混合,然后只为这些格式提供sRGB更新和混合功能。
现在我不知道该为我的纹理像素格式指定什么。
好吧,那么渲染缓冲区呢?ARB_framebuffer_sRGB文档没有提到任何关于呈现缓冲区的内容。是否可以将glRenderbufferStorageMultisample与sRGB格式一起使用,以便获得启用sRGB存储的混合?
另外,在为GL_SRGB_ALPHA指定内部格式时,GL_SRGB8_ALPHA8和glTexImage2D有什么区别?
发布于 2012-02-26 22:46:45
我不确定的是我应该做些什么改变
那是因为你的问题似乎不确定你想做什么。
所有这些信息的关键是在任何时候都知道输入数据是什么以及输出数据是什么。
您的第一步是知道什么是存储在您的每一个纹理。特定的纹理是在sRGB颜色空间中存储线性数据还是数据?如果它存储线性数据,那么使用一种线性图像格式。如果它存储sRGB颜色空间数据,那么使用sRGB图像格式之一。
这确保了您正在获取您想要的数据在您的着色器。当需要将它们写入/混合到框架缓冲区时,您现在需要决定如何处理它。
您的屏幕期望的值已被更正为显示设备的伽马值。因此,如果提供线性值,则会得到不正确的颜色输出。
但是,有时您希望写入中间值。例如,如果您正在进行前向或延迟呈现,则将累积照明写入浮点缓冲区,然后使用HDR色调映射将其压缩为0,1图像以供显示。后处理技术可以再次使用。只有输出到0,1需要是图像在sRGB颜色空间。
当写入要转换为sRGB的线性RGB值时,必须启用GL_FRAMEBUFFER_SRGB。这是一个特殊的启用(请注意,纹理没有办法关闭sRGB解码),因为有时,您希望写入已经在sRGB中的值。GUI界面小部件通常是这样的,它们是使用sRGB颜色空间中已经存在的颜色来设计和构建的。
在我的教程系列中,我将介绍与写入伽马校正值和从纹理中读取它们相关的问题。第一个解释为什么伽马是重要的,并明确地做伽马校正在着色器。第二个链接包括如何在纹理和帧缓冲区中使用sRGB图像。
好吧,那么渲染缓冲区呢?ARB_framebuffer_sRGB文档没有提到任何关于呈现缓冲区的内容。
为什么要这么做?ARB_framebuffer_sRGB只对框架缓冲区和其中图像的性质感兴趣。它既不知道也不关心这些图像从何而来。它不关心它是在讨论默认的框架缓冲区、附加到FBO上的纹理、附加到FBO的渲染缓冲区,还是明天会出现全新的东西。
扩展说明当目标图像位于sRGB颜色空间和启用GL_FRAMEBUFFER_SRGB时会发生什么。图像从何而来取决于你。
另外,GL_SRGB_ALPHA和GL_SRGB8_ALPHA8在为glTexImage2D指定内部格式时有什么区别?
一个是大小的。另一个不是。理论上,GL_SRGB_ALPHA可以为您提供实现所需的任何位深度。它可以给你每个组件2位。你给了实现自由来选择它想要的。
在实践中,我怀疑你会发现不同之处。也就是说,只要有可能,总是使用大小大小的内部格式。具体说明您想要什么,并防止实现做一些愚蠢的事情,这是很好的。OpenGL甚至有一些大小为如所述,需要明确支持的格式。
https://stackoverflow.com/questions/9457597
复制相似问题