主题:  求助!光线跟踪和光能传递的区别MAYA4.0、4.5有光能传

jinghu

职务:普通成员
等级:1
金币:0.0
发贴:8
注册:2002/7/9 15:37:32
#12002/7/24 10:45:13
各位大虾!我记得MAYA4.0里灯光有光线跟踪阴影,材质有光线跟踪折射。
可光能传递又是什么算法?



5D荣誉斑竹

职务:普通成员
等级:5
金币:10.0
发贴:1326
注册:2002/2/13 13:21:48
#22002/7/24 13:24:36

转BBS 水木清华站



首先是关于三维图形学中的两个困难问题:
1. 光照模型: 一束光照到物体表面上的一点, 会发生什么现象? 最简单的一种情
况就是均匀的漫反射, 出射的光强 = 入射的光强 * 漫反射系数 * cos(入射角),
这叫Lambert模型(Lambert好像是一个18世纪的人). 还有很多复杂的模型, 可以
描述镜面反射/折射, 色散, 各向异性的反射率, 等等. 在三维软件中一般用"材
质"来表现.
2. 光的传递问题: 一个场景中的各个物体间在光的照射下, 会产生如何的相互作
用? 也就是说, 光是如何来回传递的? 物体间相互作用而产生的现象有很多, 例如,
阴影; 还有光在物体表面间相互传递所产生的间接照明. 由于是研究物体间的相互
作用, 这个问题一般被称为"全局照明"(Global Illumination); 相对的,光照模型
研究单个点的光照, 也被称为"局部照明".

一般来说, 为了解决"全局照明", 染色过程要分为两个pass: 照明过程和采样过程.
radiosity(光能传递)是照明过程, 是最早被使用来解决"全局照明"的方法. 其它
"全局照明"的方法还包括photon map等.
而raytrace是一种采样算法, gauround, phong等算法也是. 实时图形库(像opengl)
和早期的染色程序和都只有采样过程, 无法产生"全局照明". 例如opengl中的阴影,
并不是场景设定好了就会自动出现, 而一定要通过stencil buffer等方法来模拟.

对raytrace的简要说明: 从观察点所在的位置出发, 通过一个像素做一条射线. 追
踪这条射线, 如果这条射线和一个surface交于一点, 记下这一点, 再看看是否有镜
面反射/折射发生, 如果有, 从这一点产生新的反射/折射射线, 继续追踪. 这样下
去, 就生成了一棵二叉树. 这个像素的亮度就是二叉树所有节点的亮度和. 至于每
个节点的亮度, 如果前面有照明过程的话, 就使用照明过程的结果, 否则可以直
接按光照模型计算. 对图像中所有像素重复以上过程, 就得到图像. 注意, 追踪的
深度必须加以限定.
这是最简单的一种raytracing. raytracing有很多扩展算法, 如Monte-Carlo
Raytracing, 可直接解决全局照明.
raytracing有一些优点: 不需要投影, 不需要消隐(raytracing本身就是消隐算法),
不需要剪裁.

对radiosity的简要说明: 全局照明从数学上来看是这样一个问题: 给定一个场景及
其初始亮度分布(就是光源啦), 求任意表面上任意一点的亮度. 这个问题可以写成
一个很简单的积分方程, 称为光的传输方程. 但这个方程很难解, 从数学上看,
radiosity实际上是使用了有限元法来解这个方程.
最简单的一种radiosity算法是progressive radiosity: 1.把场景(包括光源)分割
成大量的小多边形, 称为patch. 光源的光能处于未出射的状态. 2.找到未出射光能
最大的一个patch, 把它出射的光能加到其它所有的patch上: 从一个patch i发出的
光能有百分之多少能到达另一个patch j, 这个参数称为form factor.这个参数有很
多种求法. 之后把这个patch的未出射光能设为零. 3. 反复执行步骤2, 场景将由暗
变亮, 逼近真实效果. 结果将存储起来, 供以后的采样算法, 如gauround, phong,
raytracing等生成图像使用.
progressive radiosity比较简单, 但效率不高. 目前用的较多的是各种wavelet
radiosity算法.

radiosity和raytracing并没有完全解决上面提到的两个图形学的困难, 尤其是全局
照明. 光的传输可以一个正则表达式来形象的说明, E代表眼睛, L代表光源, D表示
漫反射/折射, S表示镜面反射/折射, 那么光从光源到眼睛的路程为L(D|S)*E, (*应
该是上标, 这里显示不出), 单使用gauround(如opengl)只能计算LDS, 单使用ray-
tracing: LDS*E, 单使用radiosity: LD*E, 先radiosity再raytrace: LD*S*E. 如果
传输中出现...SD..., 这些方法就都不能解决. 例如, 一面镜子会反射光线, 照亮其
它物体. 这种现象称为caustic, 实际上就是由镜面反射/折射引起的间接照明.现在
很多混合算法可以解决L(D|S)*E, 但是离实用还有一段距离.

注maya没有也不需要,做动画不可能用这个,渲一幅单帧就够慢的