2

現在、私はglutSolidSphereを使用して、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);
}

詳細情報:球は常に特定の場所にありますが、ユーザーはマウスを使用して回転し、差分ビューからすべての球を表示できます。

4

2 に答える 2

5

以下にいくつかの提案を示します。

  1. 球体を含む頂点バッファー オブジェクト (VBO) を作成し、これを glutSolidSphere を使用する代わりにレンダリングします。
  2. インスタンス化を検討してください。つまり、1 回のドローコールで多くの球体を描画します。

次の記事は、あなたが望むことをほぼ正確に行います: http://sol.gfxile.net/instancing.html

于 2012-04-05T09:44:57.103 に答える
2

本当に効率が必要で、球体のみを扱っている場合は、単一のクワッドとシェーダーのみを使用して無限の解像度で実際に球体を描画できます。基本的には数学を使って球体を計算します。テクスチャのない円から始めます。深度、法線、ライティング、テクスチャリングなどを追加します。

これにより、ピクセルごとに球体が計算され、必要に応じて高解像度になります。

于 2012-04-07T02:39:48.290 に答える