glVertexAttribPointer 如何处理字节?

How does glVertexAttribPointer work for bytes?

根据我的理解,OpenGL 在顶点着色器中使用之前将所有顶点属性数据转换为 32 位浮点数。但是 glVertexAttribPointer 也采用数据类型 GL_BYTEGL_UNSIGNED_BYTE(8 位)。如果我缓冲并将一个无符号字节数组发送到 gpu 并使用

glVertexAttribPointer(0, 3, GL_UNSIGNED_BYTE, GL_FALSE, 3 * sizeof(unsigned char), (void*)0);

这样做,send-to/store-on 将 gpu 作为字节数组,然后在着色器读取它们时将它们转换为浮点数?这将使我的更新速度翻两番并使我的内存翻四倍 space。还是 send/store 将它们作为浮点数或做其他事情?有没有办法在着色器中将 VBO 读取为整数或字节? glVertexAttribIPointer 有什么不同吗? 如果您想知道为什么,我的游戏使用 256x256x256 块,所以...

参见 glVertexAttribPointer 每个字节都是属性的一个组成部分,并转换为浮点值。如果参数 normalized 设置为 GL_TRUEGL_UNSIGNED_BYTE 分量将被视为无符号标准化值并从 [0, 255] 范围映射到 [0.0, 1.0] ].

如果你想使用整数属性(intivec2ivec3ivec4)你必须使用glVertexAttribIPointer(关注I) 从具有整数组件值的数组加载属性。 glVertexAttribIPointer 保留整数,不转换为浮点数。

请注意,type 参数并未说明有关着色器属性类型的任何信息。它只指定数组中源数据的类型。