http://dev.gameres.com/Program/Visual/3D/Radiosity_Translation.htm
辐射度算法的一个好的方面是它能够十分容易地通过使用3D渲染硬件来优化。只要你能让它做直接的纹理映射,并且关闭着色器、反锯齿以及多贴图(Mip-maps)等。
具体的优化方法可能并不是你所想象的那样,但它工作得很好,可以让CPU和渲染硬件平行工作。硬件负责处理纹理映射以及隐面消除(Z缓冲),而CPU负责剩下的工作。
就我所知,目前还没有渲染硬件能够处理浮点型的光照数据,甚至不能处理超过255的光照强度。因此我们无法让它直接渲染带有光照信息的场景,然而,只需一点小技巧,我们可以让硬件来做纹理映射和隐面消除,只要你通过一个快速的循环回读光照信息。
如果3D硬件可以向屏幕写入33位像素,那么它就可以用来写入任何32位的值。3D硬件并不能真正地向屏幕写入浮点型的RGB值,但它可以写入32位的指针,指向那儿应当出现的面片。一旦有了这个渲染结果,你只需简单地读出每个像素,让后使用它的32位值作为指针定位到那儿应当被渲染的面片。
这是从上面的场景中取出的一张面片贴图。每个像素都由3个浮点数构成,它们分别代表R、G、B通道的值。因此3D硬件不能直接处理这样的贴图。 |
|
这里是另外一张贴图。它看起来十分的怪异,但是现在不要理会它看起来的样子。在这个贴图中每个像素都是一个32位的值,代表了左图中相应面片的指针。 为什么这个贴图的颜色看起来会有这种效果是因为最低位的三个字节被解释成了颜色。 |
一旦你有了一整套这样的指针纹理(每个表面都有一个),你可以把它传给3D硬件让其渲染。渲染出来的场景看起来像右图这样。 场景看起来十分奇怪,但你可以辨认出这些表面都覆盖了像上图那样的纹理。这些像素不应该被理解为颜色,而应该是指针。如果你的显卡使用32位的纹理,那么它会以ARGB的形式出现,且A、R、G、B各 占8位。不要理会这样的结构,把每个像素都当作一个32位的值,把它们作为内存指针来重新创建被面片覆盖的场景。 重要: 你必须确保场景是被纯纹理映射的。这就是说:无线性插值,无动感模糊,无着色器/光照,无多贴图,无雾效、无伽马校正。如果你不禁用这些,产生出来的地址就不会指向正确的地方,你的程序肯定会崩溃。 |
如何优化辐射度计算过程应该解释得比较清楚了。如果还有不明白的方,告诉我,我会试着加上更多的解释。
辐射度渲染器的输出是一幅每个像素都是三个浮点数的图片。图片中亮度的范围可能十分的广泛。如同我之前所说的那样,天空的亮度比室内表面的亮度要亮的多。而且太阳还要比它亮几千倍。你怎样处理这样的图片呢?
你普通的显示器最多只能产生很暗的光线,并不比室内的表面所发出的光亮多少。如果要显示这样的图片就需要一个能发出和太阳光一样强烈的光线的显示器。而且显卡对于每个通道都要有一个浮点数。这些东西在技术上并不存在,更别说安全因素。那么你应该怎么做呢?
很多人对照片对真实世界的记录感到满意,并且认可它是对真实世界忠实的记录。他们错了。照片重现现实中的光亮的本领并不比显示器强。照片不能发出像太阳一样强烈的光,但人们却从不怀疑它的真实性,这就是让人迷惑的地方。
我们的视觉正是我们最重要的感观。我们每天的生活都信任它,但到目前为止对它的信任还没让我们死亡。它常常拯救了我们的生命。对于我们的祖先来说,这也是一个重要的感观,对于最早的后来发展为人类的鱼来说也是如此。我们的眼球经历了一段漫长的进化过程,对我们的生存有着至关重要的作用,因此它们确实十分的优秀。它们能够感受到非常低的光照度,最低能低到5个光子,同样还能感受到非常明亮的天空。眼球并不是视觉系统的唯一部分,可能更重要的是它们之后的大脑。一个令人难以相信的神经网络,由多层处理过程组成,然后把眼球的输出转化为我们对眼前事物的感知。大脑必须能够辨认出同样的物体,无论它是被照亮还是非常的暗。而且还能做一些让令人惊奇的光线补偿。我们不曾注意到当我们从非常亮的室外走到一个被暗淡的黄色光源照亮的室内时,眼前光亮程度的变化。当你在这两种情况下拍照时,你可能需要改变不同型号的胶卷来防止照出来的图片很黄或很黑。
试着这样做:在一个阴天出门,站在一个白色物体前,然后看着天上的云,你会觉得这个物体变成灰色了,但你重新看回这个物体时,它又恢复了白色。这说明什么问题?白色的东西被灰色的云所照亮,因此不会存在比云更亮的东西了。但是我们 仍然能够区分出它是白色的。如果你不相信我,以天上的云为背景给白色的物体照一张相。你会看见白色的东西比云暗得多。
别相信你的眼睛: 它们比你聪明得多。
那么你要怎么做呢?既然人们信服照片带来的真实性,我们可以把渲染器的输出作为场景中的光照模型,然后仿照照相机的原理做一个粗糙的近似。我已经写了一篇关于这部分的文章:Exposure, 因此我就不再多费口舌了。
参考文献
The Solid Map: Methods for Generating a 2D Texture Map for Solid Texturing: http://graphics.cs.uiuc.edu/~jch/papers/pst.pdf
This paper will be very useful if you are going to try to implement your own radiosity renderer. How do you apply a texture map evenly, and without distortion across some arbitary polygonal object? A radiosity renderer will need to do this.
Helios32: http://www.helios32.com/
Offers a platform-independent solution for developers looking for radiosity rendering capabilities.
Radiosity In English: http://www.flipcode.com/tutorials/tut_rad.shtml
As the title suggests this is an article about Radiosity, written using English words. I didn't understand it.
Real Time Radiosity: http://www.gamedev.net/reference/programming/features/rtradiosity2/
That sounds a little more exciting. There doesn't seem to be a demo though.
An Empirical Comparison of Radiosity Algorithms: http://www.cs.cmu.edu/~radiosity/emprad-tr.html
A good technical article comparing matrix, progressive, and wavelet radiosity algorithms. Written by a couple of the masters.
A Rapid Hierarchical Radiosity Algorithm: http://graphics.stanford.edu/papers/rad/
A paper that presents a rapid hierarchical radiosity algorithm for illuminating scenes containing large polygonal patches.
KODI's Radiosity Page : http://ls7-www.informatik.uni-dortmund.de/~kohnhors/radiosity.html
A whole lot of good radiosity links.
Graphic Links: http://web.tiscalinet.it/GiulianoCornacchiola/Eng/GraphicLinks6.htm
Even more good links.
Rover: Radiosity for Virtual Reality Systems: http://www.scs.leeds.ac.uk/cuddles/rover/
*Very Good* A thesis on Radiosity. Contains a large selection of good articles on radiosity, and very many abstracts of papers on the subject.
Daylighting Design: http://www.arce.ukans.edu/book/daylight/daylight.htm