在我的應用程序中,我在3D場景上繪製了數千(〜10k)2D圓圈。我有它的工作,但是當這個圈子很多時(圓圈很小,直徑〜16像素),性能很慢。我繪製圓代碼如下所示:OpenGL繪製成千上萬的2D圈子
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();
有什麼我做顯然是錯誤這裏呈現放緩:
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();
}
名單如下產生?我應該考慮在這裏使用頂點緩衝區嗎?還是有其他技術來加速這一點?
感謝, 傑夫
你能提供一個關於如何做到這一點的例子嗎?我還沒有太高級的openGL。 – 2011-04-14 21:30:59