2014-01-20 4 views
0

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

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

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

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

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

+0

Я добавил методы состояния glEnableClient, но он по-прежнему рисует пустой экран. И ArrayList удерживает Floats объект, который я конвертирую в массив с плавающей точкой. –

+0

вы используете 'glGenBuffers()' для создания дескрипторов где-то? Также вы должны просто просто поместить Floats в float, прежде чем добавлять их в свой буфер, как этот 'for (Float f: colorVertices) {VertexColorData.put ((float) f);}' Просто заметили, что вы используете 'glPushMatrix() 'и' glPopMatrix' до и после рисования, которые не нужны, push и pop используются для сохранения текущей матрицы, а затем перезагружают ее позже после того, как вы применили к ней преобразования, которые вы хотите отменить. Я не замечаю ничего другого, что могло бы быть проблемой из того, что вы опубликовали. – Alex

Смежные вопросы