【发布时间】:2014-04-12 14:52:59
【问题描述】:
我正在尝试学习如何处理 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 个向量 A B C 组成,每个向量定义一个顶点。在第一行中,我为顶点分配空间,每个三角形 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());这一行,但我找不到我的错误...
【问题讨论】:
标签: java opengl lwjgl vertex-array vertex-array-object