сбой при отображении из VBO

#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 Дайте нам знать, работает ли это так, как ожидалось.