gpt4 book ai didi

opengl - 何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?

转载 作者:行者123 更新时间:2023-12-03 14:49:20 25 4
gpt4 key购买 nike

我有一个渲染系统,在该系统中,我使用多采样渲染缓冲区绘制到 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_A2GL_R11F_G11F_B10FGL_RGBA16F 作为最后的手段)。

至于这个:

On Windows with the Intel HD 3000 it will not apply the sRGB nonlinearity



这几乎可以肯定是因为英特尔不擅长编写 OpenGL 驱动程序。如果启用 GL_FRAMEBUFFER_SRGB 时它没有做正确的事情,那是因为英特尔,而不是您的代码。

当然,也可能是英特尔的驱动程序一开始就没有给你一个 sRGB 图像(如果你渲染到默认的帧缓冲区)。

关于opengl - 何时调用 glEnable(GL_FRAMEBUFFER_SRGB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com