Joglを使用して3Dジオメトリを描画する単純なアプリケーションをJavaで作成しました。カメラを回転させるには、マウスをドラッグします。アプリケーションはうまくいきますが、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);
この1つの頂点/通常の配列だけを描画していますか?またはあなたのシーンで進行中の他のものがあります... – Zevan