Объект вершинного буфера из ArrayList?

Я пытаюсь прочитать и создать VBO из ArrayList, а затем визуализировать его. Проблема в том, что я просто отображаю пустой экран. Все работало нормально, когда я сразу же рендерил его; только теперь с VBO это не работает.

Игровой цикл выглядит следующим образом: камера вызывает функции 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 (вместо того, чтобы сразу разорвать его).


person Anubian Noob    schedule 20.01.2014    source источник


Ответы (1)


Перед рендерингом вам нужно вызвать glEnableClientState(GL_VERTEX_ARRAY) и glEnableClientState(GL_COLOR_ARRAY). Вы также должны отключить их после рендеринга.

Кроме того, в настоящее время вы воссоздаете свои VBO в каждом проходе рендеринга, что обычно не является хорошей идеей. Если вы визуализируете статическую сцену, вам нужно создать их только один раз, и если вам нужно обновить свою сцену, вы должны использовать glBufferSubData или glMapBuffer для обновления только тех частей, которые необходимо изменить, вместе с Gl_STREAM_DRAW вместо GL_STATIC_DRAW в качестве подсказки по использованию.

Кроме того, я не знаю, почему вы используете Float.intBitsToFloat(Float.floatToIntBits(f)); или создаете массив с плавающей запятой, когда вы можете поместить свои числа с плавающей запятой прямо в буфер.

person Alex - GlassEditor.com    schedule 20.01.2014
comment
Я добавил методы состояния glEnableClient, но он по-прежнему рисует пустой экран. И ArrayList содержит объект Floats, который я конвертирую в массив с плавающей запятой. - person Anubian Noob; 20.01.2014
comment
вы используете glGenBuffers() для создания дескрипторов? Также вы должны иметь возможность просто преобразовать поплавки в поплавки, прежде чем добавлять их в свой буфер, как это for(Float f:colorVertices){VertexColorData.put((float)f);} Только что заметил, что вы используете glPushMatrix() и glPopMatrix до и после рисования, которые не нужны, push и pop используются для сохранения текущей матрицы а затем перезагрузите его позже после того, как вы применили к нему преобразования, которые хотите отменить. Я не вижу ничего другого, что могло бы быть проблемой из того, что вы написали. - person Alex - GlassEditor.com; 20.01.2014