2010-01-27 113 views
0

我想在使用OpenGL线条的同时在屏幕上绘制很多线条,性能很慢,并且建议我使用顶点缓冲区。我是顶点缓冲区的新手 - 我是否需要为每个要绘制的线条添加一个新的缓冲区,或者是否为所有线条使用单个缓冲区(它们不一定相互连接)?在这一点上,我有一个行列表(每行是顶点列表),但我不知道如何快速渲染这些行。任何帮助,将不胜感激。带顶点缓冲区的Java OpenGL线条绘图

编辑:这是我目前的代码,它给出了一个例外: EDIT2:在调用glVertexPointer之前倒回缓冲区修正了由于put推进缓冲区而引起的异常。这现在已经修复。

java.lang.IndexOutOfBoundsException: Required 1 remaining elements in buffer, only had0 
at com.sun.gluegen.runtime.BufferFactory.rangeCheck(BufferFactory.java:247) 
at com.sun.opengl.impl.GLImpl.glVertexPointer(GLImpl.java:27937) 

    for (int i = 0; i < lines.size(); i++) 
    { 
     List<Vertex> v = lines.get(i); 
     DoubleBuffer buf = BufferUtil.newDoubleBuffer(v.size() * 3); 

     Iterator<Vertex> iter = v.iterator(); 
     while (iter.hasNext()) 
     { 
      Vertex vt = iter.next(); 
      buf.put(new double[] { vt.x, vt.y, vt.z }); 
     } 
     gl.glVertexPointer(3, GL.GL_DOUBLE, 0, buf); 
     gl.glEnableClientState(GL.GL_VERTEX_ARRAY); 
     gl.glDrawArrays(GL.GL_LINES, 0, v.size()); 
     gl.glDisableClientState(GL.GL_VERTEX_ARRAY); 
    } 

希望这将提供一些更好的见解我的问题(我知道这个代码有问题,试图在这里学习虽然)。

感谢, 杰夫

回答

0

我也是一个OpenGL初学者,不熟悉Java绑定,但我会尽力为你指明正确的方向,直到一个更好的答案走来。

据我所知,只有一个顶点缓冲区。您可以使用客户端数据直接渲染顶点缓冲区。如果你想这样做,请查看glEnableClientState(GL_VERTEX_ARRAY),glBindBuffer,glVertexPointer,glDrawElements等调用。您还需要写入索引数组。

根据opengl站点,这些调用现在被弃用,以支持顶点缓冲区对象。我对他们了解不多,但根据你的问题,这是人们对你的建议。他们是很好用此示例代码解释:

http://www.opengl.org/wiki/Vertex_Buffer_Objects

至于性能问题,它似乎奇怪,你会得到刚从线带的问题。我还会检查你的视频卡是否有正确的opengl驱动程序,或者尝试使用C++而不是java等本地语言。

+0

不,没有“只有一个”顶点缓冲区。你可以拥有尽可能多的你想要的。您不会“渲染”到VBO,您可以使用glBufferData和/或glBufferSubData填充它们。你通过使用glBindBuffer + glVertexPointer在vbo中取消数据来引用数据,并在连续的Draw中实际使用数据。 VBOs是顶点缓冲区。 – Bahbar 2010-01-27 21:21:42

0

顶点缓冲区只是由GL分配和管理的内存。因此,他们不直接与绘图相关。

现在,是的,将顶点数据直接存储在GL中可以提高性能,如果数据变化不大(避免每帧都传输数据)。

虽然你的问题不是很定量。 “这很慢”是什么意思?你想画多少条线?你目前执行多少次平局?你会得到什么样的表现?你画什么线?

很难画很多线条,因为它们都需要单独的绘图调用。但是,GL_LINES可以在同一个绘图中对多行进行批处理。这应该会更好。

编辑补充:

好吧,我看着你的代码......我不是在Java中熟悉的GL,但代码看起来可疑的,因为它没有通过BUF到VertexPointer。它通过v?您的put也看起来可疑。你不应该推双打而不是双阵列

+0

抱歉,模糊不清。我正在尝试使用GL_LINES,如上面的编辑所示,但我似乎无法使其工作。 – 2010-01-27 21:22:13

+0

是的,你是对的。那是一个类型o。代码现在可用。我将它与NASA WorldWind一起使用,但渲染速度仍然很慢。我不确定这是否与WorldWind或OpenGL相关... – 2010-01-27 22:03:32