- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 这个函数也不会被执行。因为它根本就不存在于显示列表中。
另
您可能关注的文档
- M2U1课件4-新标准(三起)小学英语五年级下册.ppt
- MC7800系列 1.0A三端正电压稳压器.pdf
- mei美泰公司标准最新版本Q版本.pdf
- MTK 方案主板通电开不了机分析.doc
- nk第04篇+第04章+02慢性胃炎.ppt
- NPBCQ-4A简易编程器使用说明书.pdf
- OCP8153最新资料(2014版).pdf
- OIT软体实验室顾客关系管理.ppt
- OpenJWeb网上商城介绍汽车配件版.pdf
- O型圈面密封接头.pdf
- 2025年无人机低空医疗物资投放社会效益报告.docx
- 2025年再生塑料行业包装回收利用产业链重构研究.docx
- 《AI眼镜周边产品市场机遇:2025年终端销售与需求增长洞察》.docx
- 2025年坚果加工行业深加工技术突破与市场拓展策略报告.docx
- 2025年通信芯片行业技术竞争与未来趋势报告.docx
- 《2025年生鲜电商配送冷链事故分析与预防措施》.docx
- 《商业航天融资新趋势2025民营卫星企业资本涌入估值分析市场动态》.docx
- 2025年能源绿色健康行业创新技术与市场应用报告.docx
- 2025年无人机低空医疗救援通信方案分析报告.docx
- 2025年烹饪机器人行业市场集中度分析报告.docx
原创力文档


文档评论(0)