繁体   English   中英

用glDrawArrays绘制交错的VBO

[英]drawing interleaved VBO with glDrawArrays

我目前正在使用glDrawElements来渲染使用多个VBO(顶点,颜色,纹理和索引)。 我发现很少有顶点共享,所以我想切换到glDrawArrays和一个交错的VBO。

我一直无法找到一个明确的例子:1)创建一个交错的VBO并为其添加四边形或三边形(顶点,颜色,纹理),以及2)使用glDrawArrays绘制它所需的任何内容。 这两个步骤的代码是什么?

脱离我的头顶:

//init
glBindBuffer(GL_ARRAY_BUFFER, new_array);
GLfloat data[] = { 
    0.f, 0.f, 0.f, 0.f, 0.f,
    0.f, 0.f, 100.f, 0.f, 1.f,
    0.f, 100.f, 100.f, 1.f, 1.f,
    0.f, 100.f, 100.f, 1.f, 1.f,
    0.f, 100.f, 0.f, 1.f, 0.f,
    0.f, 0.f, 0.f, 0.f, 0.f,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);

// draw
glBindBuffer(GL_ARRAY_BUFFER, new_array);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 5*sizeof(GLfloat), NULL);
glClientActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 5*sizeof(GLfloat), ((char*)NULL)+3*sizeof(GLfloat) );
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

这段代码中没有什么特别神奇的东西。 只看如何:

  • 来自data数组的data被加载:原样,所有data都是连续的
  • 各种属性的步幅设置为5 * sizeof(GLfloat),因为这是数据:3个浮点数用于位置,2个用于texcoord。 旁注,你通常希望这是2的幂,不像这里。
  • 偏移量从数组的开始计算。 因此,由于我们首先存储顶点,因此顶点的偏移量为0. texcoord存储在3个位置数据浮点数之后,因此其偏移量为3 * sizeof(GLfloat)。

由于某种原因,我没有在其中包含颜色:它们通常存储为UNORM,这使得初始化代码更加混乱。 您需要将GLfloat和GLubyte存储在同一个内存块中。 此时,如果您想在代码中执行此操作,结构可以提供帮助,但这在很大程度上取决于您的数据最终来自何处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM