Самый быстрый способ рисовать динамику c GL_TRIANGLE_STRIP - PullRequest
1 голос
/ 29 апреля 2020

После некоторых усилий мне удалось нарисовать динамический след самолета c с использованием 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);
}

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

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

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

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

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

3D Aircraft Trails

1 Ответ

1 голос
/ 30 апреля 2020

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

...