#java #opengl #jogl #vbo
#java #opengl #jogl #vbo
Вопрос:
я использую VBO для отображения кубов. Это мой код :
//создание VBO
vertices = cb.getVertices();
colors = cb.getColors();
outlinesColors = cb.getOutlinesColors();
indices = cb.getIndices();
// vertex buffer
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, cb.gpuBufferVertices);
gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.capacity() * Buffers.sizeOfBufferElem(vertices), vertices,
GL.GL_STATIC_DRAW);
// color and outlines color buffer
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, cb.gpuBufferColors);
gl.glBufferData(GL.GL_ARRAY_BUFFER, colors.capacity() * Buffers.sizeOfBufferElem(colors) outlinesColors.capacity() * Buffers.sizeOfBufferElem(outlinesColors), null,
GL.GL_STATIC_DRAW);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER,0, colors.capacity() * Buffers.sizeOfBufferElem(colors),
colors);
gl.glBufferSubData(GL.GL_ARRAY_BUFFER,colors.capacity() * Buffers.sizeOfBufferElem(colors), outlinesColors.capacity() * Buffers.sizeOfBufferElem(outlinesColors),
outlinesColors);
// indices buffer
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, cb.gpuBufferIndices);
gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices.capacity() * Buffers.sizeOfBufferElem(indices), indices,
GL.GL_STATIC_DRAW);
ПРИМЕЧАНИЕ: cb — это буфер из списка буферов, который содержит данные кубов
и это код для рендеринга :
for (CellQuadBuffer cb : listBuffers) {
vertices = cb.getVertices();
colors = cb.getColors();
outlinesColors = cb.getOutlinesColors();
indices = cb.getIndices();
if (vboEnabled) {
//rendering the cubes
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, cb.gpuBufferVertices);
gl.glVertexPointer(CellQuadBuffer.NB_COORDINATES_PER_VERTEX, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, cb.gpuBufferColors);
gl.glColorPointer(CellQuadBuffer.NB_COLORS_PER_VERTEX, GL.GL_UNSIGNED_BYTE,0 ,0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, cb.gpuBufferIndices);
gl.glDrawElements(GL2.GL_QUADS, cb.getNbIndices(), GL.GL_UNSIGNED_INT, 0);
// rendering the outlinesColors of the cubes
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, cb.gpuBufferColors);
gl.glColorPointer(CellQuadBuffer.NB_COLORS_PER_VERTEX, GL.GL_UNSIGNED_BYTE, 0,colors.capacity() * Buffers.sizeOfBufferElem(colors));
gl.glDrawElements(GL2.GL_LINES, cb.getNbIndices(), GL.GL_UNSIGNED_INT, 0);
}
Теперь, когда я запускаю, возникают проблемы с отображением: некоторые кубы не отображаются вообще и возникают проблемы с отображением цветов контуров, и я думаю, потому что я использую тот же vbo для цветов и outlinesColors и, вероятно, есть ошибка при указании смещения в glBufferSubData или glColorPointer, но я не смог понять это.
Комментарии:
1. Работает ли это без рендеринга контуров? Сколько компонентов имеют ваши цвета? Каково значение NB_COLORS_PER_VERTEX? Как выглядят цвета в ваших массивах / списках (т. е.
Color
класс)?2. Хм, на мой взгляд, ваш код выглядит нормально, так что, возможно, проблема с данными. Поскольку вы перерисовываете одни и те же кубы разными цветами, но без добавления некоторого масштабирования / смещения, вы можете пострадать от z-борьбы или от того, что ваши контуры отбрасываются z-буфером. Некоторые изображения того, что вы ожидаете, и того, что вы получаете вместо этого, помогли бы лучше понять вашу проблему.
3. NB_COLORS_PER_VERTEX = 4, а цвета состоят из 4 компонентов, и они хранятся в байт-буфере .
4. хорошо, спасибо за вашу помощь, я попытаюсь загрузить несколько изображений, но дело в том, что когда я изменяю в этой строке: gl.glColorPointer(CellQuadBuffer.NB_COLORS_PER_VERTEX, GL.GL_UNSIGNED_BYTE, 0,colors.capacity() * Buffers.sizeOfBufferElem(цвета)); и я добавляю что-то вроде 5121 в последний параметр, я начинаю получать корректное отображение некоторых контуров и целых кубов. я думаю, что есть проблема адреса здесь нет, но я считаю, что colors.capacity() * Buffers.sizeOfBufferElem(colors) — правильный адрес, потому что именно с него началось сохранение контуров в vbo .
5. Подумайте об обновлении этого потока: forum.jogamp.org/Speeding-the-display-td4032405.html Дайте нам знать, работает ли это так, как ожидалось.