Использование буферов вершин в jogl, сбой, когда слишком много треугольников - PullRequest
0 голосов
/ 22 января 2011

Я написал простое приложение на Java с использованием Jogl, которое рисует трехмерную геометрию. Камеру можно вращать, перетаскивая мышь. Приложение работает нормально, но отрисовка геометрии с помощью glBegin (GL_TRIANGLE) ... вызывает слишком медленно.

Итак, я начал использовать буферы вершин. Это также работает нормально, пока количество треугольников не станет больше, чем 1000000. Если это произойдет, драйвер дисплея внезапно выйдет из строя, и мой монтер станет темным. Есть ли ограничение на количество треугольников в буфере? Я надеялся получить 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 Ответ

3 голосов
/ 23 января 2011

Попробуйте проверить возвращаемое значение вызова glBufferData. Он вернет GL_OUT_OF_MEMORY, если не может удовлетворить numBytes.

...