第13章光源.docxVIP

  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文档。上传文档
查看更多
第13章光源

第13章 光源 要使场景中的物体可见,就需要其中一些物体可以发出最终能够反射到相机里的光线。本章介绍一个抽象类Light,它定义了光源的接口,另外还介绍了一些有 用的光源的实现。我们用一个精心设计的接口将不同类型光源的实现细节隐藏起来,这样光传输例程就可以无需知道场景中光源的类型就可以操作,这跟加速结构可 以持有任意类型的体素而无需知道其实际类型的做法有异曲同工之妙。本章只定义光线的基本功能,因为许多跟复杂光源相关的量是没有封闭形式的解的。第15章 介绍的Monte Carlo例程将使用数值近似的方法来计算这些量,从而完整地实现了光照接口。 本章介绍了一组光源的实现,虽然光源的多样性受到了pbrt的基于物理的设计的限制。在计算机图形学的领域中,人们已经开发了许多灵活的光源模型,并附加 上对多种特性的控制,例如光线按距离衰减的速率,有哪些物体可以被光源照明,有哪些物体可以投射阴影,等等。诸如此类的控制就艺术效果而言是很有用的,但 其中有许多的控制是跟基于物理的光传输算法不相容的。举个例子,考虑一个不投射阴影的光源:当在场景中加入越来越多的表面时,到达表面的总能量也会没有止 境地增加。设想有围绕着这个光源的一系列的同心的球壳,如果不考虑遮挡,每加入一个球壳就会增加被吸收的总功率。这直接违背了能量守恒:即到达被光源照射 的表面的总能量不应该大于光源所放射出的能量。 13.1 Light接口 所有光源有两个共同的参数:其中一个参数定义了光源坐标系在世界空间中的变换矩阵;另一个参数(nSamples)用来控制对光源的Monte Carloc采样。跟形体一样,在一个特定的坐标系下实现光源是很方便的(例如聚光灯总是位于其光源空间的原点,并朝+z轴方向发光)。我们使用光源-- 世界变换,就可以将光源放入场景中的任意位置,并具有任意的朝向。当我们要追踪到光源的多条阴影光线来计算软阴影时,就要用到参数nSamples;用户 可以使用该参数对光源上的采样个数进行更细致的控制。 Light Declarations = ? ? class COREDLL Light { ? ? public: ? ?? ???Light Interface ? ?? ???Light Public Data ? ? protected: ? ?? ???Light Protected Data ? ? }; 虽然存储光源--世界变换和世界--光源变换有些冗余,但省去了求逆阵Transform::GetInverse()的调用,从而简化了实现。光源的采样个数的缺省值为1;所以要实现多个采样的光源就必须提供该值。 Light Interface ? ? Light(const Transform l2w, int ns = 1) ? ?? ?? ?? ?: nSamples(max(1, ns)), LightToWorld(l2w), ? ?? ???WorldToLight(l2w.GetInverse()) { ? ? } Light Protected Data = ? ? const Transform LightToWorld, WorldToLight; Light Public Data = ? ? const int nSamples; 要实现光源类的核心函数是Sample_L()。调用这将场景中的一个点传入函数,函数返回该光源所发出的光线到该点的辐射亮度(假定两者之间没有遮 挡)。光源类还要负责初始化到光源的入射方向wi,还有初始化VisibilityTester对象,该对象含有需要追踪的阴影光线(用来探测光源和点之 间是否有遮挡)的信息。第13.1.1节将介绍VisibilityTester,如果返回黑色的辐射亮度,就没有必要初始化该对象了,例如当点p在聚光 灯的照明圆锥范围之外就是这种情况。 对于有些类型的光源,光线可以从许多方向上到达点p,而不象点光源那样只有一个方向。对于这些光源,Sample_L()函数将随机第在光源表面上采样一个点,这样就可以使用Monte Carlo积分来找到p处的来自该光源的反射光。 Light Interface += ? ? virtual Spectrum Sample_L(const Point p, Vector *wi, ? ?? ???VisibilityTester *vis) const = 0; 所有光源必须能够返回它们所释放的总功率,该值对光传输算法很有用,因为算法可以对场景中有最大照明的光源进行更多的计算。由于系统其它部分并不需要放射功率的精确值,本章所介绍的几个实现将计算该值的近似值。 Light Interface += ? ? virtual Spectrum

文档评论(0)

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

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

1亿VIP精品文档

相关文档