glVertexAttribPointer 如何处理字节?
How does glVertexAttribPointer work for bytes?
根据我的理解,OpenGL 在顶点着色器中使用之前将所有顶点属性数据转换为 32 位浮点数。但是 glVertexAttribPointer 也采用数据类型 GL_BYTE
和 GL_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_TRUE
,GL_UNSIGNED_BYTE
分量将被视为无符号标准化值并从 [0, 255] 范围映射到 [0.0, 1.0] ].
如果你想使用整数属性(int
、ivec2
、ivec3
、ivec4
)你必须使用glVertexAttribIPointer
(关注I
) 从具有整数组件值的数组加载属性。 glVertexAttribIPointer
保留整数,不转换为浮点数。
请注意,type 参数并未说明有关着色器属性类型的任何信息。它只指定数组中源数据的类型。
根据我的理解,OpenGL 在顶点着色器中使用之前将所有顶点属性数据转换为 32 位浮点数。但是 glVertexAttribPointer 也采用数据类型 GL_BYTE
和 GL_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_TRUE
,GL_UNSIGNED_BYTE
分量将被视为无符号标准化值并从 [0, 255] 范围映射到 [0.0, 1.0] ].
如果你想使用整数属性(int
、ivec2
、ivec3
、ivec4
)你必须使用glVertexAttribIPointer
(关注I
) 从具有整数组件值的数组加载属性。 glVertexAttribIPointer
保留整数,不转换为浮点数。
请注意,type 参数并未说明有关着色器属性类型的任何信息。它只指定数组中源数据的类型。