gpt4 book ai didi

opengl - 使用 glDrawArrays 绘制交错的 VBO

转载 作者:行者123 更新时间:2023-12-02 08:11:13 26 4
gpt4 key购买 nike

我目前正在使用 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 数组中的数据:按原样,全部连续
  • 各种属性的步长设置为 5*sizeof(GLfloat),因为这就是数据中的内容:3 个 float 表示位置,2 个 float 表示 texcoord。旁注,您通常希望它是 2 的幂,与这里不同。
  • 偏移量是从数组的开头计算的。因此,由于我们首先存储顶点,因此顶点的偏移量为 0。texcoord 存储在 3 个 float 位置数据之后,因此其偏移量为 3*sizeof(GLfloat)。

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

关于opengl - 使用 glDrawArrays 绘制交错的 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5906742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com