- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个渲染系统,在该系统中,我使用多采样渲染缓冲区绘制到 FBO,然后将其传送到具有纹理的另一个 FBO 以解析样本,以便在绘制到后缓冲区时读取纹理以执行后处理着色( FBO 索引 0)。
现在我想获得一些正确的 sRGB 输出......问题是程序的行为在我在 OS X 和 Windows 上运行时相当不一致,这也取决于机器:在 Windows 上使用 Intel HD 3000 它不会应用 sRGB 非线性,但在我的另一台带有 Nvidia GTX 670 的机器上它可以。在 OS X 中的 Intel HD 3000 上,它也将应用它。
所以这可能意味着我没有设置我的 GL_FRAMEBUFFER_SRGB
在程序的正确位置启用状态。但是我似乎找不到任何教程可以真正告诉我什么时候应该启用它,他们只提到它非常容易并且没有性能成本。
我目前没有加载任何纹理,所以我还不需要处理线性化它们的颜色。
为了强制程序不要简单地吐出线性颜色值,我尝试的是简单地注释掉我的 glDisable(GL_FRAMEBUFFER_SRGB)
行,这实际上意味着对整个管道启用了此设置,实际上我在每一帧上都将其强制恢复为冗余。
我不知道这是否正确。它确实对颜色应用了非线性化,但我不知道这是否会被应用两次(这会很糟糕)。它可以在我渲染到我的第一个 FBO 时应用 Gamma 。当我将第一个 FBO 传送到第二个 FBO 时,它可以做到这一点。为什么不?
我已经拍摄了最后一帧的屏幕截图,并将原始像素颜色值与我在程序中设置的颜色进行比较:
我将输入颜色设置为 RGB(1,2,3),输出为 RGB(13,22,28)。
这似乎在低端进行了相当多的色彩压缩,这让我怀疑 Gamma 是否被多次应用。
我刚刚完成了 sRGB 方程,我可以验证转换似乎只应用了一次,因为线性 1/255、2/255 和 3/255 确实映射到 sRGB 13/255、22/255 和28/255 使用公式 1.055*C^(1/2.4)+0.055
.鉴于对于这些低颜色值的扩展如此之大,如果多次应用 sRGB 颜色变换,它确实应该很明显。
所以,我还没有确定正确的做法是什么。 glEnable(GL_FRAMEBUFFER_SRGB)
仅适用于最终的帧缓冲区值,在这种情况下,我可以在我的 GL 初始化例程中设置它,然后忘记它?
最佳答案
当GL_FRAMEBUFFER_SRGB
已启用,所有写入图像的 an sRGB image format将假设输入颜色(正在写入的颜色)在线性颜色空间中。因此,它将它们转换为 sRGB 颜色空间。
对非 sRGB 格式的图像的任何写入都不应受到影响。因此,如果您正在写入浮点图像,则不会发生任何事情。因此,您应该能够将其打开并保持这种状态; OpenGL 会知道您何时渲染到 sRGB 帧缓冲区。
通常,您希望尽可能长时间地在线性色彩空间中工作。只有经过后期处理的最终渲染应该涉及 sRGB 颜色空间。因此,您的多重采样帧缓冲区可能应该保持线性(尽管您应该为其颜色提供更高的分辨率以保持准确性。使用 GL_RGB10_A2
、 GL_R11F_G11F_B10F
或 GL_RGBA16F
作为最后的手段)。
至于这个:
On Windows with the Intel HD 3000 it will not apply the sRGB nonlinearity
GL_FRAMEBUFFER_SRGB
时它没有做正确的事情,那是因为英特尔,而不是您的代码。
关于opengl - 何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386199/
我有一个渲染系统,在该系统中,我使用多采样渲染缓冲区绘制到 FBO,然后将其传送到具有纹理的另一个 FBO 以解析样本,以便在绘制到后缓冲区时读取纹理以执行后处理着色( FBO 索引 0)。 现在我想
我正在尝试使用 GL_FRAMEBUFFER_SRGB 将 sRGB 空间值写入帧缓冲区,但我发现 glEnable(GL_FRAMEBUFFER_SRGB) 的调用仅适用于前/后缓冲区,不适用于从纹
我是一名优秀的程序员,十分优秀!