我正在尝试使用对椭圆函数的多次调用来创建一个模式,它绘制了这样的特征:
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循环?
答案 0 :(得分:0)
OpenGL显示列表并不关心循环或任何其他编程结构。基本上,它们只是在 glNewList 和 glEndList 之间按顺序调用的每个 OpenGL 函数的记录。它就好像你用 gl ... (并且只有那些)以 print 语句打印到某种文件中的每个函数包围着。在调用显示列表时,只需回放内容&#34;播放&#34;。构建显示列表时使用的任何循环仅与围绕 printf 的调用循环一样有效 - 基本上是相同的效果。
为什么你没有看到性能差异?因为使用现代GPU,驱动程序必须将对 glVertex 及其朋友(即时模式绘制调用)的调用编译成一个命令缓冲区,无论如何都要提交给GPU。而且这个命令缓冲区与显示列表本身的内容没那么不同。如果对 glVertex 的调用量增加,您将看到函数调用和内存分配开销的影响。尝试用一些大号替换360,例如1000000。