我在理解如何使用一个包含 3 个不同数据的缓冲区时遇到问题,我的 vert、text、color 数据具有以下结构:
struct xyzf {
float x, y, z;
};
struct xyf {
float x, y;
};
struct vertype {
xyzf points[4];
};
struct textype {
xyf points[4];
};
struct coltype {
GLuint points[4];
};
struct buftype {
vertype vertex;
textype texcoord;
coltype color;
};
然后我(尝试)以下列方式使用它(这对我来说最有意义):
glBindBufferARB(GL_ARRAY_BUFFER, mybufid);
glVertexPointer(3, GL_FLOAT, sizeof(buftype), 0);
glTexCoordPointer(2, GL_FLOAT, sizeof(buftype), (GLvoid *)sizeof(vertype));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(buftype), (GLvoid *)(sizeof(vertype)+sizeof(textype)));
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_QUADS, 0, indices);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER, 0); // unbind
但是它失败了,并且它呈现的东西与我将步幅和指针全部设置为零所得到的不同。当我这样做时,我得到了正确渲染的顶点数据,但文本/颜色仍然不正确。
我不能将 &data[0].vertex 用于 glVertexPointer() 等中的最后一个参数,因为由于我使用的是 VBO,所以我不再拥有数据,该方法仅适用于顶点数组。
另外我不确定 glDrawArrays() 的计数值是如何工作的,我读过文档说它是索引,所以一个四边形应该有 4,对吗?但是当我将四边形的数量乘以 4 时,它只会渲染我的一半顶点,这是怎么回事?(如果我乘以 8,它将把它们全部呈现出来......)