opengl中的顶点缓冲区

时间:2010-04-05 11:26:32

标签: opengl oop 3d directx

我正在为个人学习制作一个小型3D图形游戏/演示。我知道d3d9和d3d11相当有点关于opengl,所以我打算抽象出图形的实际渲染,这样我的场景图和“上面”的一切都需要知道如何实际绘制图形。我打算让它与d3d9一起工作,然后添加d3d11支持,最后支持opengl。就像学习3D图形和抽象的学习练习一样。

我现在对opengl了解不多,并且不希望我的抽象接口暴露出在opengl中不易实现的任何东西。具体来说,我正在寻找顶点缓冲区。在d3d中,它们本质上是一个结构数组,但是看一下opengl接口,等价似乎是顶点数组。然而,在需要单独的顶点数组,一个用于法线,一个用于纹理坐标等,并使用glVertexPointer,glTexCoordPointer等设置时,这些组织似乎组织得相当不同。

我希望能够像directx那样实现一个VertexBuffer接口,但是在d3d中看起来你有一个结构数组,而在opengl中你需要一个单独的数组用于每个元素,这使得找到一个共同的抽象很难提高效率。

有没有办法以类似于directx的方式使用opengl?或者有关如何提出更高级别抽象的任何建议,这些抽象将有效地与两个系统一起工作?

1 个答案:

答案 0 :(得分:3)

顶点数组有一个步幅和偏移属性。这特别适用于结构数组。

因此,假设您要设置一个带浮点数顶点和浮点数2纹理坐标的VBO,您需要执行以下操作:

// on creation of the buffer
typedef struct { GLfloat vert[3]; GLfloat texcoord[2]; } PackedVertex;
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glBufferData(...); // fill vboname with array of PackedVertex data

// on using the buffer
glBindBuffer(GL_ARRAY_BUFFER, vboname);
glVertexPointer(3, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(0)));
glTexCoordPointer(2, GL_FLOAT, sizeof(PackedVertex), BUFFER_OFFSET(offsetof(PackedVertex, texcoord));

使用BUFFER_OFFSET将宏转换为相应的指针(vbos使用指针参数作为偏移量),并使用另一个宏的offset来查找PackedVertex结构内texcoord的偏移量。在这里,它可能是sizeof(float)* 3,因为结构内部不太可能有任何填充。

相关问题