我正在制作一个小型 3D 图形游戏/演示以供个人学习。我了解 d3d9 和很多关于 d3d11 的知识,但目前对 opengl 知之甚少,所以我打算抽象出图形的实际渲染,以便我的场景图和“上面”的所有内容都不需要了解如何实际绘制图形。我打算让它与 d3d9 一起工作,然后添加 d3d11 支持,最后添加 opengl 支持。就像学习 3D 图形和抽象的学习练习一样。
不过,目前我对 opengl 知之甚少,并且不希望我的抽象接口公开任何在 opengl 中不易实现的内容。具体来说,我正在研究顶点缓冲区。在 d3d 中,它们本质上是一个结构数组,但查看 opengl 接口,等效的似乎是顶点数组。然而,它们的组织方式似乎相当不同,您需要一个单独的顶点数组,一个用于法线,一个用于纹理坐标等,并使用 glVertexPointer、glTexCoordPointer 等进行设置。
我希望能够实现一个与 directx 非常相似的 VertexBuffer 接口,但看起来在 d3d 中你有一个结构数组,而在 opengl 中你需要为每个元素一个单独的数组,这使得找到一个共同的抽象非常困难高效的。
有没有办法像directx一样使用opengl?或者关于如何提出可以在两个系统中高效工作的更高级别的抽象有什么建议吗?
顶点数组具有步幅和偏移属性。这是专门为了允许结构数组。
因此,假设您想要设置一个具有 float3 顶点和 float2 纹理坐标的 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 使用指针参数作为偏移量),使用 offsetof 另一个宏来查找 PackedVertex 结构内 texcoord 的偏移量。在这里,它可能是 sizeof(float)*3,因为结构内部不太可能有任何填充。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)