第1章 光线跟踪器和程序设计.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第1章 光线跟踪器和程序设计 一款符合自然环境特征的光线跟踪器可视为一类庞大、复杂的软件系统,需要进行缜密地设计以及系统地开发。本章将简要地概述光线跟踪器的设计和程序设计。另外,读者也可从Glassner(1989),Wilt(1994),Shirley(2002),Shirley-Morley(2003)以及Pharr-Humphreys(2004)的著作中获取相关资料。 Clemson大学提供的骨骼模型(图像由Jimmy Nguyen提供) 1.1 通用解决方案 这里,建议采用面向对象(object-oriented,OO)技术开发光线跟踪器,原因包括:首先,需满足系统的规模和复杂度的要求。面向对象技术适用于庞大、复杂系统的设计与开发,而光线跟踪器恰好符合这一要求。例如,Kilauea光线可称得上是一类大型的光线跟踪器,它包含了约700000行C++代码(Kato等,2001;Kato,2002)。虽然这里所讨论的光线跟踪器不至于如此庞大,但其规模和复杂程度也应将OO技术列为首选方案。 其次是系统的扩展性能,同时,这一问题也与上述因素分不开,因为任何一个庞大、复杂的软件系统均由较为简单的系统扩充而来。光线跟踪器的扩展方式多种多样,例如,可通过添加新的几何对象类型加以实现。同时,应尽量完善光线跟踪器的设计以使这一添加操作尽可能简捷。因此,OO技术符合这一要求,即无需更改现有对象的渲染代码。另外,光线跟踪器应能够处理不同类型的相机、采样器、光照、BRDF、材质、映射操作、纹理、噪声纹理以及凹凸映射。基于光线跟踪器,添加上述任何内容都应实现操作的简捷性。 下面,将考察OO技术如何实现上述过程。例如,执行光线-对象碰撞检测的代码无需了解其所处理的对象类型。否则,需要显式地确认每一个对象的类型,并进行相交测试或在switch语句中加以判断。这极大地增加了程序编写的工作量,需要为每一种对象类型提供相应的标识符ID。更为糟糕的是,switch语句很可能在光线跟踪器代码中多次出现。因此,在光线跟踪器的相交测试部分,采用匿名对象可视为一类较好的选择。这就需要针对相交碰撞检测函数定义一个统一的公共接口,并对全部对象采用同一方式加以调用。随后,光线跟踪器可在运行期内获取相应的对象类型,并调用正确的碰撞检测函数。 这里,可采用同样的方式处理光照、材质、纹理等。此时,除了内建函数以及#include语句之外,光线跟踪器可弱化其处理的对象类型。从设计及开发的角度来看,这一点对光线跟踪器十分重要。 1.2 继承 实现上述内容的最佳方案是使用继承结构。如图1.1所示为几何对象间的继承关系图。倘若正确地实现了对象的编码,动态绑定可确保正确地调用相应的碰撞检测函数——这称为多态。 图1.1 对象间的继承关系图 另外,继承结构还有助于实现代码的复用。继承类可使用基类中的全部代码,这意味着,在添加新的继承类时,只需单独编写更新部分即可。例如,单独处理材质的代码只需在GeometricObject类中编写一次。 1.3 语言 本书中的示例代码均采用C++语言编写,同时,该语言也是设计更新跟踪器的主流程序语言,原因包括:C++语言对面向对象技术的强大支持、可在同一程序中实现C/C++代码的混合编程以及高效的计算性能。其中,较有代表性的几款光线跟踪器,例如Brazil、Mental Ray、finalRender以及Maxwell Render均采用了C++语言加以编写。同时,诸多采用C语言编写的商业级渲染和动画包也在20世纪90年代实现了C++改写。另外,RenderMan插件的编写也相应地支持C++语言。考虑到兼具C语言特征以及全编译特性,C++语言可实现高效的程序编码。因此,针对如何编写出高效的?C++代码,程序员需格外留意。关于C++语言的计算性能,Meyers(1996,2001,2005)、Lippman等(2005)以及Bulka-Mayhew(2000)的相关著作中均探讨了这一问题。这里,需要注意的是,与编写高效的代码相比,代码的易读性、可维护性以及可扩展性往往显得更加重要。换句话讲,良好的设计方案往往是我们追逐的首选目标,在这一点上,效率问题可以退而求其次。幸运的是,C++语言兼具上述两种特征。另外较为重要的一点是,为了减轻程序员的负担,可采用充分体现语言特征的某些机制进行编码。例如,考虑到虚函数调用导致的额外(间接)消耗,以及动态绑定将关闭虚函数的内联功能,过度使用C++语言中的继承机制将会产生所谓的“性能惩罚”,从而使计算效率得不偿失。 C++语言支持C标准库,另外,其自身也包含了不错的库工具,例如标准模板库(STL),具体内容可参见Lippman等(2005)、Meyers(2001)以及Ford-Topp(2001)的相关著作。同时

文档评论(0)

精品文库 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档