2011-01-22 65 views
0

我已经使用Jogl在Java中编写了一个简单的应用程序,该应用程序绘制了3D几何体。可以通过拖动鼠标来旋转相机。该应用程序工作正常,但用glBegin(GL_TRIANGLE)...调用画几何太慢。在jogl中使用顶点缓冲区,当太多的三角形崩溃时

所以我开始使用顶点缓冲区。这也可以正常工作,直到三角形的数量大于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); 
+0

你只绘制这一个顶点/正常数组吗?或者在你的场景中还有其他的东西... – Zevan 2011-01-22 23:06:54

回答

3

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

+0

对不起,我应该澄清这个答案。 glBufferData不会“返回”GL_OUT_OF_MEMORY。相反,它会“产生”错误。你可以在调用glBufferData()后调用glGetError()来获取错误() – 2011-01-23 02:10:34