【问题标题】:Vertex Buffer Object from ArrayList?来自 ArrayList 的顶点缓冲区对象?
【发布时间】:2014-01-20 06:48:49
【问题描述】:

我正在尝试从 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(而不是立即渲染它)。

【问题讨论】:

    标签: java opengl 3d lwjgl voxel


    【解决方案1】:

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

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

    另外,我不知道你为什么要使用 Float.intBitsToFloat(Float.floatToIntBits(f)); 或创建一个浮点数组,而你可以将你的浮点数直接放入缓冲区。

    【讨论】:

    • 我添加了 glEnableClient 状态方法,但它仍然绘制一个空白屏幕。并且 ArrayList 持有 Floats 对象,我将其转换为浮点数组。
    • 您是否使用glGenBuffers() 在某处创建句柄?此外,您应该能够简单地将浮点数转换为浮点数,然后再将它们添加到缓冲区中,就像这样for(Float f:colorVertices){VertexColorData.put((float)f);} 刚刚注意到您在绘制之前和之后使用glPushMatrix()glPopMatrix,这是不需要的,push 和 pop 是用于保存当前矩阵,然后在您对其应用要撤消的转换后重新加载它。我没有注意到您发布的任何其他内容可能存在问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多