是否可以在openGL中的显示列表中执行for循环?

时间:2015-05-14 16:05:21

标签: c++ opengl

我正在尝试使用对椭圆函数的多次调用来创建一个模式,它绘制了这样的特征:

 glBegin(GL_LINE_LOOP);
    for(int i=0; i < 360; i++)
    {
        //convert degrees into radians
        float degInRad = i*DEG2RAD;
        glVertex2f(cos(degInRad)*xradius,sin(degInRad)*yradius);
    }
glEnd();

为了加速渲染,我决定将所有内容放在显示列表中并创建main()调用的以下函数:

void features::drawEllipse(float xradius, float yradius, GLuint index)
{
    glNewList(index, GL_COMPILE);
        glBegin(GL_LINE_LOOP);
        for(int i=0; i < 360; i++)
        {
            //convert degrees into radians
            float degInRad = i*DEG2RAD;
            glVertex2f(cos(degInRad)*xradius,sin(degInRad)*yradius);
        }
        glEnd();
    glEndList();
}

但是当我在主

上进行呼叫时,没有证据表明性能更好
static GLuint ellipseList;
...
drawEllipse(0.2,0.3,ellipseList);

我做错了什么,或者显示列表中是否允许使用for循环?

1 个答案:

答案 0 :(得分:0)

OpenGL显示列表并不关心循环或任何其他编程结构。基本上,它们只是在 glNewList glEndList 之间按顺序调用的每个 OpenGL 函数的记录。它就好像你用 gl ... (并且只有那些)以 print 语句打印到某种文件中的每个函数包围着。在调用显示列表时,只需回放内容&#34;播放&#34;。构建显示列表时使用的任何循环仅与围绕 printf 的调用循环一样有效 - 基本上是相同的效果。

为什么你没有看到性能差异?因为使用现代GPU,驱动程序必须将对 glVertex 及其朋友(即时模式绘制调用)的调用编译成一个命令缓冲区,无论如何都要提交给GPU。而且这个命令缓冲区与显示列表本身的内容没那么不同。如果对 glVertex 的调用量增加,您将看到函数调用和内存分配开销的影响。尝试用一些号替换360,例如1000000。