Java 顶点数组的问题
我正在尝试学习如何处理VBO(VertexBufferObjects),但我只能学习顶点数组。我遵循了一些关于这个主题的基本教程,每一个都以不同的方式进行教学,这使我很难理解和实施 问题:使用Java 顶点数组的问题,java,opengl,lwjgl,vertex-array,vertex-array-object,Java,Opengl,Lwjgl,Vertex Array,Vertex Array Object,我正在尝试学习如何处理VBO(VertexBufferObjects),但我只能学习顶点数组。我遵循了一些关于这个主题的基本教程,每一个都以不同的方式进行教学,这使我很难理解和实施 问题:使用glDrawArrays()进行渲染的工作方式应与即时模式下的渲染相同。因此,我试图通过测试代码,但我得到的只是本机代码中的JVM崩溃。询问谷歌一点帮助都没有,因为这种方法有几十种变体。但我认为我的参数是主要问题 以下是我到目前为止得到的信息: 我使用LWJGL,所以我将数据存储在浮动缓冲区中: Float
glDrawArrays()进行渲染代码>的工作方式应与即时模式下的渲染相同。因此,我试图通过测试代码,但我得到的只是本机代码中的JVM崩溃。询问谷歌一点帮助都没有,因为这种方法有几十种变体。但我认为我的参数是主要问题
以下是我到目前为止得到的信息:
我使用LWJGL,所以我将数据存储在浮动缓冲区中:
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();
也没什么特别的,到目前为止看到的一切对我来说都很好。但是数组变量让我头疼
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, 0, buffer);
glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());
glDisableClientState( GL_VERTEX_ARRAY );
崩溃的JVM生成的错误日志指向gldrawArray(GL_三角形,0,buffer.capacity())代码>行,但我找不到我的错误 首先,您需要在代码中添加buffer.flip()
Java中的缓冲区有一个内部当前位置,这是LWJGL在调用glvertexinter(…)
时用来标记数据开头的位置。每次调用buffer.put(…)
,它都会增加缓冲区的大小,并将当前位置设置为缓冲区的结尾
调用flip(…)
将当前位置移动到缓冲区的开头。这样,当您尝试绘制容量(…)
-从“当前”位置开始的多个顶点时,将不会溢出缓冲区
此外,每个顶点都是从3浮动中构建的。这里的容量是根据浮点组件的数量来衡量的,所以存储在缓冲区中的顶点数量实际上是它的容量除以3似乎有效,我将用它做更多的测试。谢谢