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