2012-04-05 6 views
2

glutSolidSphereを使用して50k +球体の球体を描画します 速度が極端に遅いです。OpenGLを使用して50k球体を描画するときの速度を改善する方法

速度を上げる方法や提案はありますか?以下

は詳細については

void COpenGlWnd::OnPaint() 
{ 
    CPaintDC dc(this); 
    ::wglMakeCurrent(m_hDC, m_hRC); 
    for(int k = 0; k < m_nCountZ; k++) 
    { 
     for(int j = 0; j < m_nCountY; j ++) 
     { 
      for(int i = 0; i < m_nCountX; i ++) 
      { 
      ::glPushMatrix(); 
      ........ 
      ::glutSolidSphere(Size[i][j][k], 36, 36); 
      ........ 
      ::glPopMatrix(); 
      } 
     } 
    } 
    ::SwapBuffers(m_hDC); 
} 

...私のコードです: 球は常に特定の場所になりますが、ユーザが違いビューからすべての球を回転させて見るために、マウスを使用することができます。

+0

詳細については – Nick

答えて

5

は、ここでの提案のカップルです:

  1. は球を含む頂点バッファオブジェクト(VBO)を作成し、glutSolidSphereを使用する代わりに、これをレンダリングします。
  2. インスタンス描画に目を向けると、1回の描画で多くの球を描画しています。

次の資料ほぼ正確に何をしたいん:http://sol.gfxile.net/instancing.html

+0

ありがとう、私はそれを調べます! – Nick

+0

球体がすべて静的である場合(投稿後に書かれた場合)、VBOが確実に行かれます。可能な限り多くの球を含むバッファーのコレクション。 – GManNickG

+0

@ニコルボラス:Hm?私は、数百または数千の事前生成された球体を頂点バッファにパックして(空の領域を横切る縮退三角形を使用して)、それらをすべて1回の呼び出しでレンダリングすると言っています。 – GManNickG

2

あなたが本当に効率をしたいだけの球を扱っている場合は、you can actually draw a sphere with infinite resolution using only a single quad and a shader。基本的には、球を計算するために数学を使用します。 untextured circleで始める。深度、法線、ライティング、テクスチャリングなどを追加します。

これは、ピクセルごとの球を計​​算し、必要に応じて高解像度にします。

関連する問題