如何在glVertexAttribPointer中处理字节?

3
根据我的理解,OpenGL在将所有顶点属性数据用于顶点着色器之前会将其转换为32位浮点数。但是glVertexAttribPointer函数还可以接受GL_BYTE和GL_UNSIGNED_BYTE(均为8位)数据类型。如果我缓冲并发送一个无符号字节的数组到GPU,并使用...
glVertexAttribPointer(0, 3, GL_UNSIGNED_BYTE, GL_FALSE, 3 * sizeof(unsigned char), (void*)0);

这样做会将数据作为字节数组发送/存储到GPU,然后在着色器读取时将其转换为浮点数吗?这将使我的更新速度增加四倍,内存空间减少四分之三。或者这样做是将它们作为浮点数发送/存储还是采取其他措施?是否有一种方法可以在着色器中将VBO作为整数或字节读取? glVertexAttribIPointer 是否有任何不同的功能?如果你想知道为什么,我的游戏使用256x256x256个块。

1个回答

2
请看glVertexAttribPointer。每个字节是属性的一个组件,并转换为浮点值。如果参数normalized设置为GL_TRUE,则GL_UNSIGNED_BYTE组件将被视为无符号规范化值,并从范围[0, 255]映射到[0.0, 1.0]。
如果要使用整数属性(int, ivec2, ivec3, ivec4),必须使用glVertexAttribIPointer (重点在于I) 从具有整数分量值的数组中加载属性。glVertexAttribIPointer保留整数数字,不将它们转换为浮点数字。
请注意,type参数并不代表着着色器属性的类型。它只指定了数组中源数据的类型。

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