我能否使用glVertexAttribPointer而不是glVertexAttribIPointer?

4

我阅读的一篇教程 特别推荐使用glVertexAttribIPointer来处理整数数据,将数据上传到着色器中的ivec4数据类型中。

我想知道为什么不能使用GL_INT数据类型来使用glVertexAttribPointer。为什么会破坏我的数据?查看API参考并没有提示。


更正了错误。 - dev_nut
似乎这是一个重复的问题,但我的问题会获得更多的点击量。 - dev_nut
1个回答

6
我查看了OpenGL 3.3(核心配置文件)规范,只在第29页找到以下内容:
“如果normalized为TRUE,则由VertexAttribPointer指定的数组的数据将通过标准化转换为浮点数;否则将直接转换为浮点数。由VertexAttribIPointer指定的数组的数据始终保留为整数值;这些数据被称为纯整数。”
我没有发现任何明确提到是否有错误检查、未指定的值或未定义行为,但是假设您的属性数组将整数转换为浮点数,但您的着色器需要整数,则会导致不正确的属性值。
我知道非常老的硬件上到处使用浮点数,因此ivec4只是vec4的伪装。因此,即使在您的硬件上可以工作,也不应该这样做。
总之,不要这样做。

对于OpenGLES规范,VertexAttribIPointer不可用,所以我不得不使用glVertexAttribPointer(..., ..., GL_INT,...将整数传递给着色器作为in vec4,然后我进行了逐段整数转换,看起来在我的驱动程序上可以工作,这是你所说的即使这在你的硬件上可以工作,你也不应该这样做的意思吗?还是你特别指的是ivec4?谢谢。 - undefined
1
@gohere: 是的,你可以在glVertexAttribPointer中使用GL_INT,但正如你所说,输入类型将变为vec4(浮点类型),而不是ivec4(整数类型)。glVertexAttribIPointer的目的是让你可以使用ivec4和其他类似的输入类型。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接