在jogl中使用顶点缓冲区,当太多三角形时崩溃

时间:2011-01-22 16:59:27

标签: opengl jogl vbo

我使用Jogl在Java中编写了一个简单的应用程序,它绘制了一个3d几何体。可以通过拖动鼠标来旋转相机。该应用程序工作正常,但使用glBegin(GL_TRIANGLE)调用几何...调用太慢。

所以我开始使用顶点缓冲区。这也可以正常工作,直到三角形的数量大于1000000.如果发生这种情况,显示驱动程序突然崩溃,我的montior变暗。缓冲区中有多少个三角形是否有限制?我希望以合理的帧速率渲染1000000个三角形。

我不知道如何调试此问题。令人讨厌的是,我必须在每次启动后重新启动Windows,因为我没有其他办法让我的显示器再次工作。有人能给我一些建议吗?

顶点,三角形和法线存储在数组float [] [] m_vertices,int [] [] m_triangles,float [] [] m_triangleNormals中。 我用以下内容初始化缓冲区:

        // generate a VBO pointer / handle
        if (m_vboHandle <= 0) {
            int[] vboHandle = new int[1];
            m_gl.glGenBuffers(1, vboHandle, 0);
            m_vboHandle = vboHandle[0];
        }

        // interleave vertex / normal data
        FloatBuffer data = Buffers.newDirectFloatBuffer(m_triangles.length * 3*3*2);
        for (int t=0; t<m_triangles.length; t++)
            for (int j=0; j<3; j++) {
                int v = m_triangles[t][j];
                data.put(m_vertices[v]);
                data.put(m_triangleNormals[t]);
            }
        data.rewind();

        // transfer data to VBO
        int numBytes = data.capacity() * 4;
        m_gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_vboHandle);
        m_gl.glBufferData(GL.GL_ARRAY_BUFFER, numBytes, data, GL.GL_STATIC_DRAW);
        m_gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

然后,渲染场景:

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, m_vboHandle);
        gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
        gl.glVertexPointer(3, GL.GL_FLOAT, 6*4, 0);
        gl.glNormalPointer(GL.GL_FLOAT, 6*4, 3*4);
        gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3*m_triangles.length);
        gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL2.GL_NORMAL_ARRAY);
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

1 个答案:

答案 0 :(得分:3)

尝试检查调用glBufferData的返回值。如果它不能满足GL_OUT_OF_MEMORY,它将返回numBytes