我正在尝试从 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();
ArrayList 有顶点和链接颜色。每个体素将其顶点添加到 ArrayList(而不是立即渲染它)。
最佳答案
在渲染之前,您需要调用glEnableClientState(GL_VERTEX_ARRAY)
和glEnableClientState(GL_COLOR_ARRAY)
。您还应该在渲染后禁用它们。
此外,您当前正在每个渲染 channel 中重新创建 VBO,这通常不是一个好主意。如果您正在渲染静态场景,则只需创建一次,如果需要更新场景,则应使用 glBufferSubData
或glMapBuffer
仅更新需要更改的部分,以及 Gl_STREAM_DRAW
而不是GL_STATIC_DRAW
作为使用提示。
另外,我不知道你为什么使用 Float.intBitsToFloat(Float.floatToIntBits(f));
或者创建一个 float 组,当您可以将浮点直接放入缓冲区时。
关于java - ArrayList 中的顶点缓冲区对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21227813/