ArrayList中的顶点缓冲区对象?

时间:2014-01-20 06:48:49

标签: java opengl 3d lwjgl voxel

我试图从ArrayList读取并创建VBO然后渲染它。问题是我只是渲染一个空白屏幕。当我立刻渲染它时,一切都很好;只有现在用VBO才能使用它。

游戏循环看起来像这样,Camera调用glTranslate和glRotate函数。

game.clearScreen();
Camera.update(delta);
try {
    game.render();
} catch (IOException e) {
    System.out.println(e);
}
Display.update();
Display.sync(FRAME_RATE);

渲染方法:

world.render(vertices,colorVertices);
FloatBuffer VertexPositionData = BufferUtils.createFloatBuffer(vertices.size());
float[] floats = new float[vertices.size()];
int i = 0;
for (Float f : vertices) {
    floats[i] = Float.intBitsToFloat(Float.floatToIntBits(f));
    i++;
}
VertexPositionData.put(floats);
VertexPositionData.flip();

FloatBuffer VertexColorData = BufferUtils.createFloatBuffer(colorVertices.size());
float[] colorFloats = new float[colorVertices.size()];
int j = 0;
for (Float f : colorVertices) {
    colorFloats[j] = Float.intBitsToFloat(Float.floatToIntBits(f));
    j++;
}
VertexColorData.put(colorFloats);
VertexColorData.flip();

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,VBOVertexHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER,VertexPositionData,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,VBOColorHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER,VertexColorData,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0);

GL11.glPushMatrix();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOColorHandle);
GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L);
GL11.glDrawArrays(GL11.GL_QUADS, 0, vertices.size()/3);
GL11.glPopMatrix();

ArrayLists具有顶点和链接颜色。每个体素都将其顶点添加到ArrayList(而不是立即将其重新发送)。

1 个答案:

答案 0 :(得分:1)

在渲染之前,您需要致电glEnableClientState(GL_VERTEX_ARRAY)glEnableClientState(GL_COLOR_ARRAY)。您还应该在渲染后禁用它们。

此外,您正在重新创建当前每个渲染过程中的VBO,这通常不是一个好主意。如果您要渲染静态场景,则只需创建一次静态场景,如果需要更新场景,则应使用glBufferSubDataglMapBuffer仅更新需要更改的部分,以及{ {1}}而不是Gl_STREAM_DRAW作为使用提示。

除此之外,我不知道你为什么要使用GL_STATIC_DRAW或创建一个浮点数组,当你可以将你的浮点数直接放入缓冲区。