我正在尝试学习如何处理 VBO(VertexBufferObjects),但我无法比 Vertex Arrays 更进一步。我遵循了一些关于这个主题的基本教程,每个教程都以不同的方式进行教学,这让我很难理解和实施。
问题:渲染glDrawArrays();
应该与立即模式渲染相同。因此,我尝试通过songho.ca测试代码,但我得到的只是本机代码中的 JVM 崩溃。询问谷歌根本没有帮助,因为这种方法有几十种变体。但我认为我的参数是主要问题。
这是我到目前为止得到的:
我使用 LWJGL,所以我将数据存储在 FloatBuffer 中:
FloatBuffer buffer = BufferUtils.createFloatBuffer(triangles.size() * 3 * 3);
for(Triangle tri : triangles) {
buffer.put((float) tri.getA().x);
buffer.put((float) tri.getA().y);
buffer.put((float) tri.getA().z);
buffer.put((float) tri.getB().x);
buffer.put((float) tri.getB().y);
buffer.put((float) tri.getB().z);
buffer.put((float) tri.getC().x);
buffer.put((float) tri.getC().y);
buffer.put((float) tri.getC().z);
}
我的三角形类由 3 个向量 ABC 组成,每个向量定义一个顶点。在第一行中,我为顶点分配空间,每个三角形 9 个浮点数(每个顶点 3 个浮点数,每个三角形 3 个顶点)。到目前为止没有什么异常,放入缓冲区的浮点数正好等于分配的大小。
立即模式渲染:
glBegin(GL_TRIANGLES);
for (Triangle tri : this.triangles) {
glVertex3d(tri.getA().x, tri.getA().y, tri.getA().z);
glVertex3d(tri.getB().x, tri.getB().y, tri.getB().z);
glVertex3d(tri.getC().x, tri.getC().y, tri.getC().z);
}
glEnd();
也没什么特别的,到目前为止看到的一切对我来说都很好。但是 Array 变体让我头疼......
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, 0, buffer);
glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
glDisableClientState( GL_VERTEX_ARRAY );
崩溃的 JVM 产生的错误日志指向该glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
行,但我找不到我的错误...