Half-Life 2 在Quake2的Lightmap 技术基础上结合了Normap,成为Normapped Radiosity Lighting,也有叫做Bumpped Radiosity Lightmap;
Half-Life 2 将Q2的光照技术发挥到了极致,然而还是不能动起来...
我尝试着用Radiosity 实现了Lightmap(没有Normap),并且竭力想让静态的Lightmap 和实时的Shadow mapping 融合起来;经过一系列的研究和尝试,初步实现了这一结果。
上图中红色的光源是动态光源,采用了Shadowmapping + Project Spot Texture 是聚光灯效果;白色的光源是静态光,用来预先计算Lightmap;运行时在Fragment Shader中将Lightmap 采样颜色和Shadow mapping /Pixel Lighting 颜色相加作为光照颜色,再和基本的Color 或者Texture 相乘;
多个实时光源简单的采用多遍渲染到纹理,然后在屏幕空间相加混合的方法融合在一起;最后再在屏幕空间和渲染场景(将实时地Shadow map 投影在屏幕上),与Lightmap纹理相加混合;然后不幸的事情是实时实时地阴影无法在光照图上变暗,因为阴影和Lightmap相加无法使其变暗;用阴影反相相减的方法,也许能够解决这个问题,但是现在我还没有找到完美的解决方案;不过在这里,这个问题不重要;因为我要重点介绍的东西,不是这个;
在竭力追求静态Lightmap 和 实时Shadow / Lighting 如何融合的问题上,为了让走进Lightmap的阴影的物体可以变暗,我曾想在输出lightmap的同时输出每个静态光源的Shadow Detph Map;因为Lightmap 是颜色图,已经不包含遮挡信息;必须使用附加的遮挡信息才能重建阴影信息;想来想去,觉得有点多此一举;
后来突发奇想,何不只要辐射度照明在光源对每像素光照之后的表面颜色扩散部分?
想法有了以后,立刻进行试验;于是我得到了标题所提到的“颜色扩散贴图”;那个时候我没有找到一个合适的名词来命名这个概念,我想把它叫做“环境辐射(Ambient Radiosity)”,但是总有沿袭 Ambient Occlusion 之嫌,所以并不满意;后来和skybreaker在交流Radiosity的时候,提到了我的想法;天才的skybreaker对这个增强部分称之为“color bleeding”;
skybreaker 是天才...
非常感谢skybreaker帮我想了一个准确的命名...我把这个增强的间接照明命名为“颜色扩散贴图(color-bleeding map)”,表示全局照明中,直接照明之后的间接照明部分。但是不能动的问题还是没有解决阿?呵呵,我们可以这样想:间接照明部分强调的是整体效果,而不是细节;所以动不动不重要;但是我把它和shadow map剥离以后,shadow map 就可以动了!进入阴影区的物体也会蒙上阴影;最后在把渲染好的color bleeding 屏幕纹理蒙上去。。。这样有了真实可信的间接照明(但是不能动);
虽然Crytek的ssao可是实时变化,而且效果还是令人满意的,但它只是遮挡的明暗信息,却没有表面对光的漫射信息;颜色扩散贴图可以解决这个问题。颜色扩散贴图不能动,但是不重要。
受ssao启发,我在想颜色扩散贴图是否也可以向ssao的方法一样把颜色扩散出去?但是仔细想过以后,发现没有这么简单;现在的实时辐射度不就是在做的这个么?即便有这种可能,对于屏幕每个象素要采集的影响因子恐怕不只是周围的几个像素了。我想过采集周围的三角面,只用顶点来color bleed,采用二次衰减以及N*L方法。。。
这个话题有点远了,不过我会尝试的。和大家分享一下我的渲染效果图吧,时间仓促,做的粗糙,请各位谅解 :)
< shadow map + color-bleed map >
multi lights 叠加的 shadow map render texture和 color-bleed map render texture 在屏幕空间中投影,然后在fragmet shader中叠加,然后和其他颜色相乘的结果。可以看到在最终的合成结果中,叠加的见解照明部分是一种整体效果:全场加亮(阴影和光源照射区域都被加亮),明暗变化变缓,颜色扩散的亮区也变得比较不明显;即便静态的光源颜色和位置方向发生了变化,对间接照明部分的影响也不大,比如光源移动到了绿墙的左边,这个时候应该看起来绿色的亮区应该是在左侧,但是在整体氛围的烘托下,不是很重要。重要的是阴影自由了,可以和任何动态光源的阴影一样,叠加,以及把进入阴影的动态物体变暗,这个是非常明显而且重要的。另外红墙的颜色变成了灰色,看起来有点怪,其实没有问题,周围的蓝绿色和自身的红色叠加,以及白光的照射,得到的结果就是趋近于灰白色。而绿光不同,绿光受到蓝绿环境(绿色为主)以及白光照射,还是保持绿色。
特别感谢引擎研发群里的各位朋友的支持,感谢零一等各位群友们的热情支持和关注,虽然小白总在“诋毁”我,但是可以看作一位诤友,没有严格的挑毛病,哪能不断地完善?小白也是天才。。。大家都是天才,就我是个番薯,不过,事情还没有终结,还有更多的地方需要完善,我会不断努力的。。。