lightmap从根本上来说是一种贴图技术,它完全可以利用gpu的纹理化固定管线实现,利用多纹理化的技术,把光照贴图纹理和物体的颜色纹理相乘实现,实际上在通用的固定流水线中视关闭了光照的顶点处理过程,也没有使用像素光照。从根本上来说,在gpu的流水线中,lightmap没有进行光照和任何的图像处理,他的光照运算是通过预计算在流水线之外的cpu过程中处理的,因此可以理解成它是一种提前着色的技术,这种提前而且是在应用程序初始化时,全局计算一次,它是cpu密集的算法,通过迭代使用辐射度算法,从而使用了全局光照模型,高真实模拟自然光照效果,它是一种静态光照技术。由于走的固定管线没有改变,因此半透明效果可以正常使用。这是hl1的技术,在source引擎中,后来引入了normal mapping的集成,实际上normal mapping是一种逐像素着色技术,最先应用于phong动态光照模型中,source引擎把这一本来在动态光照中计算的normal map同样提前到lightmap的计算中,同样也就融合了normal map表现凸凹细节的优点,同时走的还是不变的流水线,因此可以正确使用alpha半透明,但是同样是静态的光照效果。
普通的radiosity lightmap:
带normal map 的rediosity最终效果图:
epic的unreal3的Deferred shading,顾名思义,延期着色,和我们理解的lightmap的提前着色相比,相对于标准的固定流水线的顶点着色或者是可编程流水线中的phong着色,他们两个一个前一个后,都走了两个极端。更重要的区别在于延期着色是一种动态光照技术,是gpu密集的光照技术,这种动态性,也就是在每一帧都计算光照,也就决定了它使用的是局部的光照模型,这种算法的设计的初衷是为了提高phong模型逐像素动态光照技术的效率,延期着色把光照技术延期到最后的图像的处理的过程,从而解决了通用的像素着色器中计算多余的像素(这些像素可能不能通过若干的流水线测试)的光照情况。这种图像的处理的办法,由于设计的本性决定计算光照时,始终只计算最靠近屏幕的像素的光强值,那些本来在被某个像素遮住的像素,如果不透明时,倒是正常,因为他本来对最终像素颜色没有贡献,但是如果是半透明时,这个被遮住的像素,按照固定流水线,本也应该计算光强的,但是由于少了normal map的法线值,从而不能计算光强,使得对最终像素有一定贡献值的半透明的像素无法正确计算光照,从而不能实现真实的alpha半透明。总之一句话,延期着色不支持alpha半透明。
可以看出延期着色是一种局部光照,每个光源都有自己的衰减半径,由于接受到光照的像素,并不会向外辐射能量,因此在衰减半径之外的像素表现很暗,这和source的辐射度表现完全不一样。
总结:
可以看出,radiosity normal mapping 和 Deferred shading虽然一个提前着色,一个延迟,但是其设计的目的不一样,辐射度算法设计的目的是为了高真实的模拟现实光照,延期着色目的是大幅度提高局部光照的效率。同时基于lightmap的辐射度的算法是静态的光照技术,而延期着色是动态的光照技术。由于场景的光照效果,只需要一次光照,这也决定了我们只能使用其中的一种光照方案。其实两者应该从效率来说都是较高的,辐射度是预计算,因此实时的时候不会重新计算。而延期着色,减少了无关的光照计算。不过一个是静态,一个是动态,一个是全局,一个是局部,这个也就是你选择方案的考虑的事情了。