本文介绍了OpenGL 绘制数千个二维圆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我在 3D 场景之上渲染了数千 (~10k) 个 2D 圆圈.我让它工作了,但是当有这么多圆圈时,性能非常慢(圆圈很小,直径约 16 像素).我绘制圆圈的代码如下所示:

In my application, I am rendering thousands (~10k) 2D circles on top of a 3D scene. I have it working, but the performance is very slow when there are this many circles (the circles are small, ~16 pixels diameter). My code for drawing the circles looks like:

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();

我在这里做的事情明显是错误的以减慢渲染速度吗?我应该考虑在这里使用顶点缓冲区吗?或者是否有其他技术可以加快速度?

Is there something I'm doing obviously wrong here to slow down the rendering? Should I consider using vertex buffers here? Or are there other techniques to speed this up?

谢谢,杰夫

推荐答案

我会想到所有这些代码

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

以及所有这些代码

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

可以在循环之外完成,并且只完成一次.

could be done outside of the loop, and just done once.

您只需要为对象平移/缩放推入和弹出一个矩阵.

You would just need to push and pop a matrix for the object translate/scale.

这篇关于OpenGL 绘制数千个二维圆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-13 20:32