【问题标题】:How to write integers to a texture buffer in OpenGL如何在OpenGL中将整数写入纹理缓冲区
【发布时间】:2017-09-11 02:40:51
【问题描述】:

我真的对 OpenGL 中的所有类型格式感到困惑。我本质上想创建一个纹理,我可以写入整数,也可以从中读取整数。我尝试了以下方法:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, bufferRes.x, bufferRes.y, 0, GL_RED, GL_INT, NULL);

这给了我一个“无效操作”错误。如果我将 GL_R32I 更改为 GL_RED 我不会收到此错误。但是GL_R32I 不是正确的格式吗?如果不是,这是为了什么?

另外,如果我想在着色器中将此纹理读取为浮点数,我知道在另一种情况下我使用了 16 位整数:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R16_SNORM, width, height, 0, GL_RED, GL_SHORT, NULL)

这是正确的做法。但是没有GL_R32_SNORM。我真的对所有这些感到困惑,因为我记得 GL_R16I 工作,但 GL_R32I 不是。

【问题讨论】:

  • @Rabbid 它确实支持它,结果我的第 7 个参数的格式错误,应该是 GL_RED_INTEGER 而不是 GL_RED。如果对任何人有帮助,我已经添加了答案。

标签: opengl glsl shader


【解决方案1】:

既然这个问题被重新打开了,既然我发现了问题所在,我也不妨解释一下错误。错误在于这一行:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, width, height, 0, GL_RED, GL_INT, NULL);

GL_RED 应该是GL_RED_INTEGER。当这个问题关闭时,我在 Nicol Bolas 的回答中找到了这个解决方案。

OpenGL 2 Texture Internal Formats GL_RGB8I, GL_RGB32UI, etc

虽然该问题涉及GL_RGB32UI 而不是GL_R32I,但问题基本相同,第7 个参数缺少_INTEGER 后缀。

这是来自 OpenGL wiki,也链接在重复的问题中:

... 对于整数像素类型,使用 浮点格式意味着像素将被假定为 标准化整数。因此它们将被解释为标准化 价值观。

如果您想将积分数据转换为积分图像格式,您可以 必须以“_INTEGER”作为像素格式的后缀。这表明 客户端像素数据是整数而不是浮点数。你 应该只使用带有完整图像的“_INTEGER”格式后缀 格式。

至于为什么GL_R32_SNORM 格式不存在而GL_R16_SNORM 存在的问题,有人告诉我,将 32 位整数读取为标准化的单精度浮点数是没有意义的,因为精度损失会很大。感谢 Nicol 和 derhass 帮助我。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 2011-05-30
    • 1970-01-01
    • 2016-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多