2011-01-22 9 views
0

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); 
+0

この1つの頂点/通常の配列だけを描画していますか?またはあなたのシーンで進行中の他のものがあります... – Zevan

答えて

3

glBufferDataを呼び出しの戻り値をチェックしてみます。 numBytesを満たすことができない場合は、GL_OUT_OF_MEMORYを返します。

+0

申し訳ありませんが、私はこの答えを明確にする必要があります。 glBufferDataはGL_OUT_OF_MEMORYを返さない。代わりにエラーを「生成」します。 glBufferData()を呼び出した後、glGetError()を呼び出してエラーを取得できます –

+0

エラーコードを確認しました。 glBufferData()呼び出しの後は0(エラーなし)です。私は追加の観察をしました。ディスプレイドライバがすぐにクラッシュすることはありません(最初のフレームはきれいにレンダリングされます)。しかし、シーンにズームしようとすると表示されます。大きすぎる大きすぎる三角形がレンダリングされると、内部オーバーフローが発生する可能性がありますか? – user585752

+0

あなたの最新のドライバは最新ですか?それが*クラッシュ*であるという事実は、ドライバーやハードウェアでさえ問題があることを示しています。別のコンピュータで試しましたか? –

関連する問題