《精》计算机图形学课件.ppt

  1. 1、本文档共167页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 注意:模板缓冲区与深度缓冲区有一点不同。无论是否启用深度测试,当有像素被绘制时,总会重新设置该像素的深度值(除非设置glDepthMask(GL_FALSE);)。而模板测试如果不启用,则像素的模板值会保持不变,只有启用模板测试时才有可能修改像素的模板值 另外,模板测试虽然是从OpenGL 1.0就开始提供的功能,但是对于个人计算机而言,硬件实现模板测试的似乎并不多,很多计算机系统直接使用CPU运算来完成模板测试。因此在一些老的显卡,或者是多数集成显卡上,大量而频繁的使用模板测试可能造成程序运行效率低下。 * 一个实际的例子:空间中有一个球体,一个平面镜。我们站在某个特殊的观察点,可以看到球体在平面镜中的镜像,并且镜像处于平面镜的边缘,有一部分因为平面镜大小的限制,而无法显示出来 假设平面镜所在的平面正好是X轴和Y轴所确定的平面,则球体和它在平面镜中的镜像是关于这个平面对称的。我们用一个draw_sphere函数来绘制球体,先调用该函数以绘制球体本身,然后调用glScalef(1.0f, 1.0f, -1.0f); 再调用draw_sphere函数,就可以绘制球体的镜像。 * void draw_sphere() { ???? // 设置光源 ???? glEnable(GL_LIGHTING); ???? glEnable(GL_LIGHT0); ???? { ???????? GLfloat ???????????? pos[]????? = {5.0f, 5.0f, 0.0f, 1.0f}, ???????????? ambient[] = {0.0f, 0.0f, 1.0f, 1.0f}; ???????? glLightfv(GL_LIGHT0, GL_POSITION, pos); ???????? glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); ???? } ???? // 绘制一个球体 ???? glColor3f(1, 0, 0); ???? glPushMatrix(); ???? glTranslatef(0, 0, 2); ???? glutSolidSphere(0.5, 20, 20); ???? glPopMatrix(); } * void display(void) { ???? // 清除屏幕 ???? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ???? // 设置观察点 ???? glMatrixMode(GL_PROJECTION); ???? glLoadIdentity(); ???? gluPerspective(60, 1, 5, 25); ???? glMatrixMode(GL_MODELVIEW); ???? glLoadIdentity(); ???? gluLookAt(5, 0, 6.5, 0, 0, 0, 0, 1, 0); ???? glEnable(GL_DEPTH_TEST); ???? // 绘制球体 ???? glDisable(GL_STENCIL_TEST); ???? draw_sphere(); ???? // 绘制一个平面镜。在绘制的同时注意设置模板缓冲。 ???? // 另外,为了保证平面镜之后的镜像能够正确绘制,在绘制平面镜时需要将深度缓冲区设置为只读的。 ???? // 在绘制时暂时关闭光照效果 ???? glClearStencil(0); ???? glClear(GL_STENCIL_BUFFER_BIT); ???? glStencilFunc(GL_ALWAYS, 1, 0xFF); ???? glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); ???? glEnable(GL_STENCIL_TEST); * ???? glDisable(GL_LIGHTING); ???? glColor3f(0.5f, 0.5f, 0.5f); ???? glDepthMask(GL_FALSE); ???? glRectf(-1.5f, -1.5f, 1.5f, 1.5f); ???? glDe

文档评论(0)

tianjiao123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档