0

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

希望这可以更好地了解我的问题(我知道这段代码有问题,尽管在这里尝试学习)。

谢谢,杰夫

4

2 回答 2

0

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

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

根据 opengl 站点,这些调用现在已被弃用,取而代之的是顶点缓冲区对象。我对他们了解不多,但是根据您的问题,这是人们对您的建议。此处的示例代码很好地解释了它们:

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

至于您的性能问题,仅从线路条中遇到问题似乎很奇怪。我还会检查您是否有适合您的视频卡的 opengl 驱动程序,或者尝试使用 c++ 之类的本地语言而不是 java。

于 2010-01-27T21:08:56.953 回答
0

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

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

你的问题虽然不是很量化。您所说的“它很慢”到底是什么意思?你想画几条线?您目前执行多少次绘图调用?你得到什么样的表现?你画什么样的线?

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

编辑添加:

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

于 2010-01-27T21:16:30.503 回答