2011-04-14 15 views
3

私のアプリケーションでは、3Dシーンの上に数千(〜10k)の2Dサークルをレンダリングしています。私はそれが働いているが、この多くの円があるとき(円は小さく、〜16ピクセルの直径)、パフォーマンスは非常に遅いです。円を描くための私のコードは次のようになります。OpenGL描画数千の2Dサークル

for (int i = 0; i < numCircles; i++) { 
    int attributeMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_TRANSFORM_BIT 
      | GL.GL_VIEWPORT_BIT | GL.GL_CURRENT_BIT 
      | GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT 
      | GL.GL_ENABLE_BIT | GL.GL_LIGHTING_BIT; 
    gl.glPushAttrib(attributeMask); 
    gl.glMatrixMode(GL.GL_PROJECTION); 
    gl.glDisable(GL.GL_LIGHTING); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 
    gl.glOrtho(0d, dc.getView().getViewport().width, 0d, dc.getView() 
      .getViewport().height, -1, 1); 

    gl.glMatrixMode(GL.GL_MODELVIEW); 
    gl.glPushMatrix(); 
    gl.glLoadIdentity(); 
    gl.glDisable(GL.GL_DEPTH_TEST); 

    Vec4 screenPt // this is calculated for each circle 
    double size = 16; 
    gl.glTranslated(screen.x, screen.y, 0d); 
    gl.glScaled(size, size, size); 

    gl.glCallList(fillListId); 
    gl.glCallList(outlineListId); 

    gl.glMatrixMode(GL.GL_MODELVIEW); 
    gl.glPopMatrix(); 
    gl.glMatrixMode(GL.GL_PROJECTION); 
    gl.glPopMatrix(); 
    gl.glPopAttrib(); 
} 

次のようにリストが生成されます。

NUM_SEGMENTS = 18; 
    double[][] vertices = new double[2][NUM_SEGMENTS]; 
    for (int i = 0; i < NUM_SEGMENTS; i++) 
    { 
     double rad = -2 * Math.PI * ((double) i)/((double) NUM_SEGMENTS); 
     double x = Math.cos(rad); 
     double y = Math.sin(rad); 
     vertices[0][i] = x; 
     vertices[1][i] = y; 
    } 

    gl.glNewList(id, GL.GL_COMPILE); 
    gl.glBegin(GL.GL_LINE_LOOP); // 2 lists are actually created, the first time GL.GL_LINE_LOOP IS is used for the outline, and the second time GL.GL_POLYGON is used for the fill 
    for (int j = 0; j < vertices[0].length; j++) 
    { 
     gl.glVertex2d(vertices[0][j], vertices[1][j]); 
    } 
    gl.glEnd(); 
    gl.glEndList(); 

は、私は、レンダリングを遅くするために、ここでは明らかに間違ってやっている何かがありますか?ここで頂点バッファの使用を検討する必要がありますか?または、これをスピードアップするための他のテクニックがありますか?

おかげで、 ジェフ

答えて

3

あなたは、単一の円を生成するテクスチャにそれをブリット、そしてちょうどその円でテクスチャされている(二つの三角形の)サーフェスを作成することができます。

+0

これを行う方法のサンプルを教えてください。私はあまりにもまだOpenGLで進んでいません。 –

3

私はこのコード

gl.glMatrixMode(GL.GL_MODELVIEW); 
gl.glPopMatrix(); 
gl.glMatrixMode(GL.GL_PROJECTION); 
gl.glPopMatrix(); 
gl.glPopAttrib(); 

のこのコード

int attributeMask = GL.GL_DEPTH_BUFFER_BIT | GL.GL_TRANSFORM_BIT 
     | GL.GL_VIEWPORT_BIT | GL.GL_CURRENT_BIT 
     | GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT 
     | GL.GL_ENABLE_BIT | GL.GL_LIGHTING_BIT; 
gl.glPushAttrib(attributeMask); 
gl.glMatrixMode(GL.GL_PROJECTION); 
gl.glDisable(GL.GL_LIGHTING); 
gl.glPushMatrix(); 
gl.glLoadIdentity(); 
gl.glOrtho(0d, dc.getView().getViewport().width, 0d, dc.getView() 
     .getViewport().height, -1, 1); 

gl.glMatrixMode(GL.GL_MODELVIEW); 
gl.glPushMatrix(); 
gl.glLoadIdentity(); 
gl.glDisable(GL.GL_DEPTH_TEST); 

のすべてとすべてのループの外で行われ、一度だけ行うことができると思うだろう。

オブジェクトの平行移動/拡大/縮小の行列を押してポップするだけで済みます。

+0

ありがとう、ありがとう。 –

関連する問題