如何在OpenGL中将整数写入纹理缓冲区

时间:2017-09-09 16:20:25

标签: opengl glsl shader

我对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不是。

1 个答案:

答案 0 :(得分: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帮助我。