绘制动态GL_TRIANGLE_STRIP的最快方法

问题描述 投票:0回答: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。因为随着位置的增加,路径的长度变长,所以getTrailVertices方法中的循环变得越来越大。例如,当程序运行10分钟后,positionList变为15,000位ArrayList。而且很可能会降低性能。除了创建新的FloatBuffer之外,我可以从末尾移除最后2个顶点,并在FloatBuffer的开头添加另外2个顶点而不创建新的吗?

第二个问题:是否可以将VBO用于这种动态绘图?如果可以,如何使用VBO?

第三个问题:如何动态更改FLoatBuffer的容量。我之所以这样问是因为我想即时增加或减少步道的长度。这意味着,如果增加路径的长度,我将需要更多的顶点和更高容量的FloatBuffer;如果减少路径的长度,这意味着我将需要更少的顶点和更低的容量FloatBuffer。

最后一个问题:如何在路径上放置纹理。或者让我这样问;我如何绘制一条颜色逐渐消失的路径。我想我需要使用alpha衰落吗?

3D Aircraft Trails

java opengl vertex-buffer vertex-array floatbuffer
1个回答
0
投票

Vertex Buffer Object的大小无法更改。 glBufferData创建一个新的缓冲区对象(它只是重复使用名称id)。可以通过glBufferDataglBufferSubData更改现有缓冲区的内容。创建具有最大大小的顶点缓冲区对象,并更新缓冲区的内容。

© www.soinside.com 2019 - 2024. All rights reserved.