1. 显示列表
显示列表是一组存储在一起的OpenGL函数,可以在以后执行。调用一个显示列表时,它所存储的函数就会按照顺序执行。OpenGL的显示列表更像是命令缓存器,而不是动态数据库,即当一个显示列表被创建之后创建显示列表以glNewList开始,以glEndList结束。通过glCallList可以调用显示列表。
尽管无法保证自己使用的OpenGL实现是否会针对任何特定用途对显示列表进行优化,但是显示列表的执行速度无论如何也不会比线性地执行存储在显示列表中的函数更慢。当然,显示列表也存在一定的开销,如果显示列表非常小,使用显示列表的开销可能会超过它所带来的的好处。在这次实验中,使用两个显示列表tableList和rabbitList分别绘制桌子和兔子。
创建显示列表的函数如下所示:
GLint GenTableList() { GLint lid=glGenLists(2);//2个空显示列表 glNewList(lid, GL_COMPILE);//创建桌子显示列表 DrawTable(); glEndList(); glNewList(lid + 1, GL_COMPILE);//兔子显示列表 DrawBunny(); glEndList(); return lid; } |
使用显示列表绘制桌子和兔子的函数如下所示:
void Draw_Table_List() { glPushMatrix(); glTranslatef(2.2, 4.5, 1.5); glScalef(2, 2, 2); //画兔子 for (int i = 1; i <= NumberOfRabbit && i<=16; i++) { glCallList(rabbitList); if (i % 4 == 0) //换行 glTranslatef(2.1f, 0, -0.5f); else glTranslatef(-0.7f, 0.0f, 0.0f); }
glPopMatrix(); glCallList(tableList); } |
每画完一个兔子就进行平移,当遇到四的倍数时换行,重新从第一个开始画。
2. 兔子数量的增加
使用全局变量NumberOfRabbit记录兔子数量,兔子的数量无上限,但是最少是1。
void key(unsignedchark, intx, inty) { …… case'i'://兔子数量增加 { NumberOfRabbit++; Row = (NumberOfRabbit+3) / 4; break; }
|