如何在VBO中使用跨步参数

How to use the stride parameter in VBO?

本文关键字:参数 VBO      更新时间:2023-10-16

我有问题理解如何使用一个缓冲区与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

但是它失败了,它呈现的东西比我设置stride和指针全部为0得到的东西要多。当我这样做,我得到我的顶点数据正确渲染,但文本/颜色仍然不正确。

我不能使用&data[0]。顶点在glVertexPointer()等最后一个参数,因为我没有数据了,因为我使用VBO,该方法只适用于顶点数组。

我也不确定glDrawArrays()的计数值是如何工作的,我读的文档说它是索引,所以一个四轴将有4,对吧?但是当我把四边形的数量乘以4时,它只渲染了一半的顶点,这是怎么回事?(如果我乘以8,它会渲染所有的)

似乎你是交叉你的数据每四边形,但你应该交叉它每顶点(至少这是通常所做的)。

如果你改变顶点布局,你的代码应该是正确的:

xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba
xyz
uv
rgba

而不是

xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba