如何在 VBO 中使用 stride 参数?

Posted

技术标签:

【中文标题】如何在 VBO 中使用 stride 参数?【英文标题】:How to use the stride parameter in VBO? 【发布时间】:2011-07-10 14:13:39 【问题描述】:

我在理解如何使用一个包含 3 个不同数据的缓冲区时遇到问题,我的垂直、文本、颜色数据具有以下结构:

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,它将全部渲染...)

【问题讨论】:

【参考方案1】:

您似乎是按四边形交错数据,但您应该按顶点交错数据(至少通常是这样做的)。

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

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

而不是

xyzxyzxyzxyz
uvuvuvuv
rgbargbargbargba

【讨论】:

该死的你是对的,现在我记得我以前也遇到过同样的问题!这似乎也解决了我遇到的索引计数问题。

以上是关于如何在 VBO 中使用 stride 参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ES2.0 中使用 VBO 画圆

strides 如何帮助在 numpy 中遍历数组?

使用 glDrawArrays() 时如何获取 VBO 的长度以渲染所有顶点?

如何在 OpenGL ES 2 中创建和使用 VBO

在 Swift 2.0 中使用 Stride

如何加载 VBO 并将其呈现在单独的 Java 线程上?