繁体   English   中英

绘制动态 GL_TRIANGLE_STRIP 的最快方法

[英]Fastest way to draw dynamic 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);
}

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

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

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

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

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

3D 飞机轨迹

顶点缓冲区 Object的大小无法更改。 glBufferData创建一个新的缓冲区 object(它只是重用了名称 id)。
现有缓冲区的内容可以通过glBufferSubDataBuffer Mapping更改。
创建一个最大尺寸的顶点缓冲区 Object 并更新缓冲区的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM