使用顶点缓冲区的Java OpenGL线条图

时间:2010-01-27 20:48:56

标签: java opengl rendering lines

我正在尝试使用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);
    }

希望这会更好地洞察我的问题(我知道这段代码有问题,尽管在这里学习)。

谢谢, 杰夫

2 个答案:

答案 0 :(得分:0)

我也是一个opengl初学者,不熟悉java绑定,但我会尝试指出你正确的方向,直到找到更好的答案。

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

根据opengl网站,现在不推荐使用这些调用,而选择Vertex Buffer Objects。我对他们了解不多,但根据你的问题,这是人们为你建议的。这里的示例代码很好地解释了它们:

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

至于你的性能问题,你会遇到线条问题似乎很奇怪。我还会检查您的视频卡是否有正确的opengl驱动程序,或者尝试使用c ++等本机语言而不是java。

答案 1 :(得分:0)

顶点缓冲区只是由GL分配和管理的内存。因此,它们与Draws没有直接关系。

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

但你的问题不是很量。你觉得“这很慢”究竟是什么意思?你想画多少行?你目前有多少次抽奖?你得到什么样的表现?你画的是哪种线条?

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

编辑添加:

好的,我查看了你的代码......我对java中的GL并不熟悉,但该代码看起来很可疑,因为它没有将buf传递给VertexPointer。它通过v?您的put看起来也很可疑。难道你不应该推双打而不是双数组吗?