OpenGL系统设计-显示列表(2)
2014-04-23 15:40
120 查看
1.1管理显示列表
上面我们直接使用了CUBELIST这个事先定义好的整数来作为显示列表的名字,这种做法在显示列表数目不多时还可以适用。一旦显示列表的数目增多,使用这种方法来管理显示列表就会带来两个问题,一是定义的管理比较麻烦,容易出错;二是一旦创建显示列表使用的名字不小心重复了已经使用的显示列表,则先创建的显示列表就随之失效了。因此,在创建显示列表时,我们有必要采用更加安全的方法。利用glGenLists(),glIsList(),glDeleteLists()这些函数,我们创建的显示列表就会更加健壮。glGenLists()会生成一组连续的空的显示列表,其原型如下:
GLuintglGenLists(
GLsizeirange
);
其中range表示这一组显示列表的数目。当range取0,或者没有可供产生的显示列表组,或者函数调用出现了错误,则函数返回0,此时也表示没有创建成功。
glGenLists()创建显示列表组成功时返回第一个显示列表的名字,虽然显示列表是UINT类型的,但是实际最多可以创建2147483647(2^31-1)个显示列表。
由于创建的显示列表组是连续的,glGenLists()首先检查有哪些值已经被占用,然后从最小的值开始建立连续的显示列表。例如,如果8已经被占用,glGenLists(10)要创建10个显示列表,则生成的显示列表范围是9~18;如果是glGenLists(7)创建7个显示列表,则从最小的1开始到7是生成的结果。
glIsList()判断某个值是否被作为显示列表占用,避免使用了已经占用的值来创建新的显示列表。glList()只有一个参数,是用来检查是否是显示列表的值,返回TRUE表示该值已经作为显示列表被占用,反之返回FALSE。
当显示列表已经不需要时,还可以使用glDeleteLists()删除显示列表,其原型如下:
voidglDeleteLists(
GLuintlist,
GLsizeirange
);
其中list是要删除的显示列表序列的第一个,range是要删除的显示列表的数目。例如glDeleteLists(9,10)表示删除9~18这10个显示列表。当范围中的某些值不是显示列表时,glDeleteLists()将会忽略。
下面我们来重新创建两个显示列表,其中list是一个GLuint类型的全局变量。
GLuintlist;
voidCreateLists()
{
list=glGenLists(2);//产生两个显示列表,
if(list)
{
glNewList(list,GL_COMPILE);//创建第一个显示列表
for(inti=0;i<10;i++)//绘制10个立方体
{
glPushMatrix();
glRotatef(36*i,0.0,0.0,1.0);
glTranslatef(10.0,0.0,0.0);
DrawCube();
glPopMatrix();
}
glEndList();//第一个显示列表创建完毕
glNewList(list+1,GL_COMPILE);//创建第二个显示列表
for(i=0;i<20;i++)//绘制20个三棱椎
{
glPushMatrix();
glRotatef(18*i,0.0,0.0,1.0);
glTranslatef(15.0,0.0,0.0);
DrawPyramid();//DrawPyramid()在前面的章节中有介绍
glPopMatrix();
}
glEndList();//第二个显示列表创建完毕
}
}
glInit()不变,glMain()如下:
voidglMain()
{
staticintangle=0;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();//加载单位矩阵
glTranslatef(0.0f,0.0f,-40.0f);
glRotated(angle,1,1,1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,g_Texture[0]);//选择纹理
glCallList(list);//调用执行第一个显示列表
glDisable(GL_TEXTURE_2D);//不带纹理
glCallList(list+1);//调用执行第二个显示列表
angle++;
SwapBuffers(g_hDC);
}
程序运行效果如图6-2所示,除了10个带纹理的立方体外,还有20个三棱椎同时围绕XYZ轴旋转。
图6-2多个显示列表
相关文章推荐
- OpenGL系统设计-显示列表(2)
- OpenGL系统设计-显示列表(3)
- OpenGL系统设计-显示列表(1)
- 软件工程课程设计问题总结——医院门诊系统(四):后台获取下拉列表的值并在页面中显示
- 【android开发】手写签名系统的设计与实现之实现文件夹以及文件列表显示(一)
- 【android开发】手写签名系统的设计与实现之实现文件夹以及文件列表显示(一)
- OpenGL系统设计-位图 字体(3) 汉字显示
- OpenGL采用显示列表显示文字完整范例
- OpenGL系统设计-DirectInput(3)
- 【OpenGL】OpenGL系列——04显示列表与光照材质
- OpenGL:显示列表
- 重装系统后outlook无法显示地址列表
- OpenGL 在Windows系统中显示文字
- OpenGL入门学习(八)(转)--显示列表
- OpenGL中显示列表的创建
- OpenGL系统设计-融合DirectXAudio
- 高效学习OpenGL之显示列表实例glCallList(),glGenLists(),glNewList(),glEndList()
- Android得到系统已安装应用程序包列表方法 自定义ListView显示 PackageManager的使用
- [开发总结]系统架构及数据模型----OpenGL模式显示及临时显示篇(二)
- Java基础——IO(拷贝文件+字节流-字符流缓冲区(装饰设计)-转换流-IO操作规律-异常日志-系统信息列表输出)