gpt4 book ai didi

opengl - sRGB FBO 渲染到纹理

转载 作者:行者123 更新时间:2023-12-02 06:33:36 31 4
gpt4 key购买 nike

在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。

我想更新它,以便获得 Gamma 正确的结果。使用 sRGB 帧缓冲区的好处是,它可以通过将非线性 sRGB 值直接存储在帧缓冲区中来获得更好的颜色精度。

我不确定的是我应该进行哪些更改才能实现此目的,以及不同的设置正在更改什么。

看起来像extension ARB_framebuffer_sRGB只是处理 sRGB 帧缓冲区的读取和混合操作。在我的情况下,我需要使用指定 sRGB 表示类型的纹理,这意味着我将使用扩展名 EXT_texture_sRGB ...使用线性纹理格式会禁用 sRGB 转换。

编辑:但我刚刚看到这个:

3) Should the ability to support sRGB framebuffer update and blending be an attribute of the framebuffer?

RESOLVED: Yes. It should be a capability of some pixel formats (mostly likely just RGB8 and RGBA8) that says sRGB blending can be enabled.

This allows an implementation to simply mark the existing RGB8 and RGBA8 pixel formats as supporting sRGB blending and then just provide the functionality for sRGB update and blending for such formats.

现在我不太确定要为纹理的像素格式指定什么。

好的,那么渲染缓冲区呢? ARB_framebuffer_sRGB 文档没有提及任何有关渲染缓冲区的内容。是否可以将 glRenderbufferStorageMultisample 与 sRGB 格式一起使用,以便我可以获得启用 sRGB 存储的混合?

另外,在指定 glTexImage2D 的内部格式时,GL_SRGB_ALPHAGL_SRGB8_ALPHA8 之间有什么区别? ?

最佳答案

What I'm not sure about is what changes should I be making to get this

那是因为您的问题似乎不确定您要做什么。

所有这些东西的关键是始终知道您的输入数据是什么以及输出数据是什么。

您的第一步是了解每个纹理中存储的内容。特定纹理是否存储线性数据或 sRGB 色彩空间中的数据?如果它存储线性数据,则使用其中一种线性图像格式。如果它存储 sRGB 色彩空间数据,则使用 sRGB 图像格式之一。

这可确保您在着色器中获取所需的数据。当需要将它们写入/混合到帧缓冲区时,您现在需要决定如何处理。

您的屏幕需要已根据显示设备的 Gamma 值进行预 Gamma 校正的值。因此,如果您提供线性值,您将得到不正确的颜色输出。

但是,有时您想要写入中间值。例如,如果您正在进行前向或延迟渲染,您将把累积的光照写入浮点缓冲区,然后使用 HDR 色调映射将其简化为 [0, 1] 图像以进行显示。可以再次使用后处理技术。仅 [0, 1] 的输出需要是 sRGB 色彩空间中的图像。

在写入要转换为 sRGB 的线性 RGB 值时,必须启用 GL_FRAMEBUFFER_SRGB。这是一个特殊的启用(请注意,纹理没有办法关闭 sRGB 解码),因为有时,您想要写入已经存在于 sRGB 中的值。 GUI 界面小部件通常就是这种情况,这些小部件是使用 sRGB 色彩空间中已有的颜色设计和构建的。

我涵盖与 writing gamma-correct values 相关的问题和 reading them from textures在我的教程系列中。第一个解释了为什么 Gamma 很重要,并在着色器中明确进行 Gamma 校正。第二个链接介绍了如何在纹理和帧缓冲区中使用 sRGB 图像。

Okay, and what about renderbuffers? the ARB_framebuffer_sRGB doc does not mention anything about renderbuffers.

为什么会这样呢? ARB_framebuffer_sRGB 仅对帧缓冲区及其中图像的性质感兴趣。它既不知道也不关心这些图像来自哪里。它并不关心它是在谈论默认帧缓冲区、附加到 FBO 的纹理、附加到 FBO 的渲染缓冲区,还是明天提出的全新内容。

该扩展说明了当目标图像位于 sRGB 色彩空间且启用 GL_FRAMEBUFFER_SRGB 时会发生什么情况。该图像的来源取决于您。

Also, what is the difference between GL_SRGB_ALPHA and GL_SRGB8_ALPHA8 when specifying the internal format for glTexImage2D?

一个是尺寸的。另一个则不然。理论上,GL_SRGB_ALPHA 可以为您提供实现所需的任何位深度。它可以为每个组件提供 2 位。您可以让实现自由地选择它想要的内容。

在实践中,我怀疑您会发现差异。话虽这么说,只要有可能,总是使用大小的内部格式。最好明确你想要什么,并防止实现做一些愚蠢的事情。 OpenGL 甚至还有一些大小的格式:required to be supported explicitly as stated .

关于opengl - sRGB FBO 渲染到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9457597/

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