Самый быстрый способ нарисовать динамический GL_TRIANGLE_STRIP

После некоторых усилий мне удалось нарисовать динамический след самолета с помощью OpenGL. Вы можете увидеть часть моего кода ниже:

private void getTrailVertices(){
   verticeBuffer = Buffers.newDirectFloatBuffer(6 * positionList.size());

   for (int i = 0; i < positionList.size(); i++) {
           List<Vec4> pointEdges = computeVec4(positionList.get(i));
            verticeBuffer.put((float) pointEdges.get(0).x).put((float) pointEdges.get(0).y).put((float) pointEdges.get(0).z);
            verticeBuffer.put((float) pointEdges.get(1).x).put((float) pointEdges.get(1).y).put((float) pointEdges.get(1).z);
        }
}

private void drawTrail(){

   verticeBuffer = getTrailVertices();

   gl.glEnable(GL.GL_BLEND);
   gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);

   float[] colors = new float[]{trailColor.getRed() / 255.f, trailColor.getGreen() / 255.f, trailColor.getBlue() / 255.f};

   gl.glColor4f(colors[0], colors[1], colors[2], 0.6f);

   gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);

   gl.glVertexPointer(3, GL.GL_FLOAT, 0, verticeBuffer.rewind());
   gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, verticeBuffer.limit() / 3);

   gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
}

Используя приведенный выше код, я могу нарисовать динамическую трехмерную ленточную дорожку. Но мне нужно улучшить производительность кода.

Мой первый вопрос: как я могу динамически изменять значения FloatBuffer, не создавая новый. Я спрашиваю об этом, потому что в каждом кадре в список позиций добавляется новый Vec4 (x, y, z), и я хочу использовать свой существующий FloatBuffer. Поскольку по мере добавления позиций длина следа становится все больше, поэтому цикл в методе getTrailVertices становится все больше и больше. Например, когда во время работы программы проходит 10 минут, positionList становится ArrayList с 15 000 позиций. И, скорее всего, это снижает производительность. Могу ли я вместо создания нового FloatBuffer удалить последние 2 вершины с конца и добавить еще 2 вершины в начало FloatBuffer, не создавая новый?

Второй вопрос: можно ли использовать VBO для такого динамического рисования? Если да, то как я могу использовать VBO?

Третий вопрос: Как я могу динамически изменить емкость FLoatBuffer. Я спрашиваю об этом, потому что хочу увеличить или уменьшить длину следа на лету. Это означает, что если я увеличу длину следа, мне понадобится больше вершин и FloatBuffer большей емкости, а если я уменьшу длину следа, это означает, что мне понадобится меньше вершин и FloatBuffer меньшей емкости.

Последний вопрос: Как мне поставить текстуру на шлейф. Или позвольте мне спросить так; как я могу нарисовать след с исчезающим цветом в конце следа. Я думаю, мне нужно использовать альфа-затухание?

3D следы самолетов


person Nebi Sarikaya    schedule 29.04.2020    source источник
comment
Да, это Java и JOGL.   -  person Nebi Sarikaya    schedule 30.04.2020


Ответы (1)


Размер объекта Vertex Buffer изменить нельзя. glBufferData создает новый буферный объект (он просто повторно использует идентификатор имени).
Содержимое существующего буфера можно изменить с помощью glBufferSubData или с помощью сопоставления буфера.
Создайте объект Vertex Buffer Object максимального размера и обновите содержимое буфера.

person Rabbid76    schedule 29.04.2020
comment
Теперь я могу добавлять новые вершины и изменять существующий плавающий буфер на лету, не прибегая к циклу for. Я использовал смесь вашей идеи и моего способа. Теперь, как я могу поместить текстуру в динамическую 3D-трассу, учитывая, что я использую floatbuffer для вершин и я использую массив вершин для рисования полосы треугольника так же, как мой исходный код выше? - person Nebi Sarikaya; 01.05.2020