我在理解如何使用一个包含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

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

我无法在glVertexPointer()等中为最后一个参数使用&data [0] .vertex。因为自从使用VBO以来,我再也没有数据了,该方法仅适用于顶点数组。

另外我不确定glDrawArrays()的计数值是如何工作的,我读了文档说它是索引,所以一个四边形会有4,对吗?但是,当我将四边形的数量乘以4时,它只会渲染一半的顶点,那又是怎么回事? (如果我乘以8,它将全部呈现出来...)

最佳答案

看来您正在按四边形交织数据,但您应该宁愿按每个顶点交织数据(至少通常这样做)。

如果将顶点布局更改为以下代码,则代码应该正确:

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

而不是
xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba

关于c++ - 如何在VBO中使用stride参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6641573/

10-14 23:57
查看更多