辐射度算法
辐射度算法,一种全局光照算法,用于三维计算机图形学绘制。和倾向于只在一个表面上模拟一次光的反射的直接光照算法(例如光线跟踪)不同,像辐射度算法这样的全局光照算法模拟光在一个场景里的多次反射,通常会导致更柔和更自然的影子和反射。
辐射度算法做为绘制方法是在1984年由康奈尔大学的研究人员(C. Goral, K. E. Torrance, D. P. Greenberg 和 B. Battaile)在他们的论文"Modeling the interaction of light between diffuse surfaces"(漫射表面之间的光线的交互的建模)中引入的。[1]该理论在工程中早有应用,用以解决辐射热传导中的问题,始于约1950年。
突出的商用辐射度算法引擎包括Lightscape(现已集成到Autodesk 3D Studio Max的内部绘制引擎中),和更新的Next Limit的Maxwell~Renderer(麦克斯韦绘制器)。
视觉特点
[编辑]辐射度在绘制过程中的引入经常对最后的场景带来更多一份的真实感,这是因为它模拟真实世界现象的方式。考虑一个在白色地板上的红球。
光打在球上,投射出一个阴影,还有将一小部分红光反射到周围的物体上 - 在这个例子中,也就是地板。该现象给白色地板靠近球的地方加上了一点红色的色调。该效应是很微妙的,但因为人类的眼睛对于其真实世界的对应现象很习惯,它可以增加真实感。
物理特点
[编辑]基本的辐射度算法方法其基础在于热辐射的理论,因为辐射度依赖于两个表面之间光能的传输。为了简化计算,辐射度算法假设该数值在整个面片上恒定(完全或理想漫射曲面);这意味着要计算精确的图像,场景表述的几何部分必须分解成更小的区域,或者说面片,然后把它们组合起来得到最后的图像。
在这个分解之后,光能传输的量可以通过使用已知的反射表面的反射率和两个面片的波形系数来计算。波形系数是一个无量纲量,它根据两个面片的几何朝向来计算,可以视为第一个面片所有可能发射区域的被第二个面片所覆盖的部分所占的比例。
更精确的讲,辐射度是每单位时间离开曲面片的能量,是发射和反射能量的组合:
其中:
- Bi 是面片i的辐射度。
- Ei 是发射的能量。
- Ri 是面片的反射系数,和入射能量(从其他面片来的能量)相乘得到反射能量。
- 所有绘制环境中的j ()对于BjFjidAj积分,得到离开每个面片j并到达面片i的能量。
- Fji 是面片i和面片j的几何关系决定的常数波形系数。
对偶性:
给出:
作为简化,积分用每个面片上恒定的辐射度取代,上式简化为:
然后该方程可以应用到每个面片。这个方程是单色的,所以彩色辐射度需要对于每个所需的色彩进行计算。
常数Fji可以用几个计算方法。早期的方法采用半立方体 (一个假想的立方体中心位于第一个曲面,第二个曲面投影于其上,由Cohen 和Greenberg于1985年提出)以逼近波形系数,也解决了相交面片的问题。这在计算上耗费很大,因为理想的波形系数必须对一个可能的面片对导出,这导致了对于增加的几何复杂度在计算上的二次增长。
参考资料
[编辑]- ^ (英文)Dudka, Kamil. RRV - Radiosity Renderer and Visualizer. dudka.cz. [1 February 2013]. (原始内容存档于2020-05-04).
外部链接
[编辑]- Radiosity Overview,来自SIGGRAPH的HyperGraph (提供Full Matrix Radiosity与Progressive Radiosity演算法)
- Radiosity,作者Hugo Elias (页面存档备份,存于互联网档案馆) (也给出了光照算法的一般介绍,附带编程实例)
- Radiosity,作者Allen Martin (页面存档备份,存于互联网档案馆) (更数学化的解释)
- RADical,作者Parag Chaudhuri (页面存档备份,存于互联网档案馆) (使用OpenGL加速的Shooting & Sorting Progressive Radiosity演算法实作范例,该程式由Colbeck制作的GLUTRAD延伸而来)