2017-09-09 72 views
-1

我真的很困惑于OpenGL中的所有类型格式。我基本上想创建一个我可以写整数的纹理,也可以从中读取整数。我试过以下内容:如何在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

什么是您的硬件?可能您的硬件不支持内部格式“GL_R32I”。 – Rabbid76

+0

@Rabbid它支持它,事实证明我对第7个参数的格式不正确,应该是GL_RED_INTEGER而不是GL_RED。如果对任何人有任何帮助,我都会添加一个答案。 – Zebrafish

回答

0

由于此问题已重新打开,并且由于我找到问题所在,所以我最好解释一下错误。错误的是,在这条线:

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在我的情况下,这个问题基本上是一样的,丢失的_INTEGER后缀第七届说法。

这是从OpenGL的维基,在重复的问题也与:

...对于整数像素类型,使用 浮点格式表示该像素将被认为是归一化的 整数。因此,它们将被解释为标准化的值 。

如果要将积分数据转换为积分图像格式,则 必须将像素格式后缀为“_INTEGER”。这表明客户端像素数据是整数而不是浮点数。你应该只使用“_INTEGER”格式后缀与积分图像 格式。

至于为什么格式GL_R32_SNORM不存在这个问题,而GL_R16_SNORM呢,有人告诉我,就不会有一点在读的32位整数作为标准化的单精度浮点数的精度损失会相当大。感谢Nicol和derhass帮助我。

相关问题