1

经过一番努力,我设法使用 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);
}

使用上面的代码,我可以绘制一条动态的 3D 带状轨迹。但我需要提高代码的性能。

我的第一个问题:如何在不创建新值的情况下动态更改 FloatBuffer 的值。我问这个,因为在每一帧中,一个新的 Vec4 (x,y,z) 被添加到位置列表中,我想使用我现有的 FloatBuffer。因为随着位置的增加,trail的长度越来越长,所以getTrailVertices方法中的循环越来越大。例如,当程序运行 10 分钟后,positionList 变为 15,000 位置的 ArrayList。这很可能会降低性能。除了创建一个新的 FloatBuffer 之外,我可以从末尾删除最后 2 个顶点并将另外 2 个顶点添加到 FloatBuffer 的开头而不创建一个新顶点吗?

第二个问题:这种动态绘图可以使用VBO吗?如果是这样,我该如何使用 VBO?

第三个问题:如何动态改变 FLoatBuffer 的容量。我问这个是因为我想在飞行中增加或减少路径的长度。这意味着,如果我增加轨迹的长度,我将需要更多的顶点和更高容量的 FloatBuffer,如果我减少轨迹的长度,这意味着我将需要更少的顶点和更低容量的 FloatBuffer。

最后一个问题:我怎样才能在轨迹上放置纹理。或者让我这样问;我怎样才能在小径的尽头画一条褪色的小径。我想我需要使用 alpha fading?

3D 飞机轨迹

4

1 回答 1

1

顶点缓冲区对象的大小不能更改。glBufferData创建一个新的缓冲区对象(它只是重用名称 id)。
现有缓冲区的内容可以通过 Buffer MappingglBufferSubData或通过Buffer Mapping进行更改。
创建一个最大尺寸的顶点缓冲区对象并更新缓冲区的内容。

于 2020-04-29T21:22:42.270 回答