OpenGL入门学习之八——使用显示列表.pdfVIP

OpenGL入门学习之八——使用显示列表.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OpenGL入门学习之八——使用显示列表.pdf

OpenGL 入门学习之八——使用显示列表 2009-01-07 11:54 我们已经知道,使用 OpenGL 其实只要调用一系列的 OpenGL 函数就可以了。然而,这种方 式在一些时候可能导致问题。比如某个画面中,使用了数千个多边形来表现一个比较真实的 人物,OpenGL 为了产生这数千个多边形,就需要不停的调用glVertex*函数,每一个多边形 将至少调用三次(因为多边形至少有三个顶点),于是绘制一个比较真实的人物就需要调用 上万次的 glVertex*函数。更糟糕的是,如果我们需要每秒钟绘制60 幅画面,则每秒调用的 glVertex*函数次数就会超过数十万次,乃至接近百万次。这样的情况是我们所不愿意看到的。 同时,考虑这样一段代码: const int segments = 100; const GLfloat pi = 3.14f; int i; glLineWidth(10.0); glBegin(GL_LINE_LOOP); for(i=0; isegments; ++i) { GLfloat tmp = 2 * pi * i / segments; glVertex2f(cos(tmp), sin(tmp)); } glEnd(); 这段代码将绘制一个圆环。如果我们在每次绘制图象时调用这段代码,则虽然可以达到绘制 圆环的目的,但是cos、sin 等开销较大的函数被多次调用,浪费了 CPU 资源。如果每一个 顶点不是通过 cos、sin 等函数得到,而是使用更复杂的运算方式来得到,则浪费的现象就更 加明显。 经过分析,我们可以发现上述两个问题的共同点:程序多次执行了重复的工作,导致 CPU 资源浪费和运行速度的下降。使用显示列表可以较好的解决上述两个问题。 在编写程序时,遇到重复的工作,我们往往是将重复的工作编写为函数,在需要的地方调用 它。类似的,在编写 OpenGL 程序时,遇到重复的工作,可以创建一个显示列表,把重复的 工作装入其中,并在需要的地方调用这个显示列表。 使用显示列表一般有四个步骤:分配显示列表编号、创建显示列表、调用显示列表、销毁显 示列表。 一、分配显示列表编号 OpenGL 允许多个显示列表同时存在,就好象 C 语言允许程序中有多个函数同时存在。C 语 言中,不同的函数用不同的名字来区分,而在 OpenGL 中,不同的显示列表用不同的正整数 来区分。 你可以自己指定一些各不相同的正整数来表示不同的显示列表。但是如果你不够小心,可能 出现一个显示列表将另一个显示列表覆盖的情况。为了避免这一问题,使用glGenLists 函数 来自动分配一个没有使用的显示列表编号。 glGenLists 函数有一个参数i,表示要分配i 个连续的未使用的显示列表编号。返回的是分配 的若干连续编号中最小的一个。例如,glGenLists(3);如果返回 20 ,则表示分配了 20 、21 、22 这三个连续的编号。如果函数返回零,表示分配失败。 可以使用 glIsList 函数判断一个编号是否已经被用作显示列表。 二、创建显示列表 创建显示列表实际上就是把各种 OpenGL 函数的调用装入到显示列表中。使用glNewList 开 始装入,使用 glEndList 结束装入。glNewList 有两个参数,第一个参数是一个正整数表示装 入到哪个显示列表。第二个参数有两种取值,如果为 GL_COMPILE ,则表示以下的内容只 是装入到显示列表,但现在不执行它们;如果为 GL_COMPILE_AND_EXECUTE ,表示在装 入的同时,把装入的内容执行一遍。 例如,需要把“设置颜色为红色,并且指定一个坐标为(0, 0)的顶点”这两条命令装入到编 号为 list 的显示列表中,并且在装入的时候不执行,则可以用下面的代码: glNewList(list, GL_COMPILE); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glEnd(); 注意:显示列表只能装入 OpenGL 函数,而不能装入其它内容。例如: int i = 3; glNewList(list, GL_COMPILE); if( i 20 ) glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 0.0f); glEnd(); 其中 i 这个判断就没有被装入到显示列表。以后即使修改i 的值,使i20 的条件成立,则 glColor3 这个函数也不会被执行。因为它根本就不存在于显示列表中。 另

文档评论(0)

zhoujiahao + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档