- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的渲染器中,我在多重采样的 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_ALPHA
和 GL_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/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!