- 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/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!