我对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
不是。
答案 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帮助我。