我使用 Jogl 用 Java 编写了一个简单的应用程序,它可以绘制 3d 几何图形。可以通过拖动鼠标来旋转相机。该应用程序工作正常,但使用 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);