接下来说一下HDR,HDR可以说是Cryengine的一个强项,也可以说Cryengine把HDR的效果推到了前所未有的高度,总之Cryengine如此照片的渲染结果和它的HDR关系最为密切。
众所周知,HDR是近年来最热门的技术之一,引擎如果不能很好地支持HDR一定会被划出一流引擎的行列。Cryengine1和Unreal3都相继支持了这个在当时象征着未来的革命性技术。HDR和Bloom有着本质的区别,虽然很多人会觉得差不多,但是HDR比Bloom多出的部分才是HDR的精髓。就算说HDR才是现世代(几年前的次世代)顶级渲染技术的根本也不为过。真实的光照会带来几十几百倍的亮度差距,而用以显示的设备却只能有一个固定有限的亮度范围,用有限的LR(低范围)设备来表现HR(高范围)的世界是一项挑战,最终我们需要一种技术把HR动态地映射到LR的设备上,这就是HDR。照片就是这种效果的典范,照片一样是LR(低范围)这与游戏中的情况一样,为啥我们却能觉得照片的还原度更好,是因为照片有个曝光的过程,通常看到的照片就是曝光较好情况,而如果自己拍摄,经常会遇到曝光不好的情况,曝光其实就是一种HDR的映射过程,人眼也有类似的过程。而对于LR无法表现的超高亮,通常是以光晕的形式出现,这并不是谁定的,而是人眼这样的感光设备在识别世界的时候自然形成的,看到照片的光晕会觉得很亮其实是人脑的潜在暗示。当然人眼的范围比起显示设备要高得多了,所以HDR的目标就是往照片靠近。由此HDR最关键的技术就是ToneMap,没有ToneMap就不叫HDR。ToneMap并不是那么容易,而且经常出现的方法效果都是非常不理想的,这个可以参考DXDemo中HDR相关的内容,这样的ToneMap效果根本就没有办法实用。Cryengine2在这个方面有了个非常大的突破,这使得Cryengine的渲染效果如此接近照片,以致难以辨认。
PS:Amazing!
经过分析,我了解了Cryengine版HDR的过人之处,再一次深深感叹日尔曼民族的强大。Cryengine的HDR并没有使用ToneMapping文献中描述的ToneMap公式。线性的ToneMap不单还原差,而且会非常明显地削弱对比度,使得场景非常平,而没有生气,其次,即使用了Lwhite作为门限来提升对比度,但过低的门限会造成曝过过度,过高呢,仍然无法解决对比度削弱的问题,这也就是为什么DX的HDRLighting无法实用的原因。不过Cryengine则使用了更好的ToneMap方法,称为ExpToneMap,其实这个也早就出来了,就是没人实实在在地去实现罢了。顾名思义,ExpToneMap会渐渐挤压远离平均亮度的颜色,而且挤压非匀速,这就产生了有很趣的效果,而且这能很好地同时挤压亮与暗的颜色,使得有效果的对比度能够很好地还原,再也不会出现平均颜色的结果了。不过,光有ExpToneMap是不够的,有心的人可以注意到,Cryengine的Bloom也非常真实,比起虚幻巨大的光晕,Cryengine的Bloom层次更多,效果更好。事实确实如此,Bloom在Cryengine中是被强化的,Bloom分成两部分,一是BrightPassBloom,二是ExtraGlow。先说BrightPassBloom,这个就是一般HDR中的Bloom,但是Cryengine中的实现却非常不同,Cryengine中一共用了6个GaussianBlur,加上两次HalfSample,一次BrightPass,一次FinalMerge,总共是十个批次,而且每个Buffer都是64位的,所以Cryengine花了非常多的资源用于Bloom的生成,当然结果是喜人的。把1/2 1/4 1/8的三层GaussianBlur的结果叠加,出现了一个非常有层次的Bloom,而且在ToneMap之前就添加进HR的颜色中,这样有效地防止了Bloom提高过多的饱和度,使Bloom看起来非常有层次。ExtraGlow也是如此,三层叠加,区别是ExtraGlow是LR的,用于处理一些特殊材质的物件的Bloom。这才有了Cryengine最终的效果。
值得一提的是,需要有正常的HDR效果,拥有HDR的天空是非常重要的。如果做静态天空的话,可以去下到HDR的天空盒,动态天空的话,需要计算大气散射。Cryengine的大气散射计算过程是看不见的,所以我自己做了一个,方法就是Siggraph1993的文献中说的。最终才得到了Cryengine般喜人的效果。HDR花了我很久,但是从我修改OGRE的曲线来看,HDR的完成一次性把我的渲染特性提升了一个档次,可见效果有多么显著。
以下是我早期的截屏,很好地说明了HDRToneMap的过程,可以看到,整个过程的色彩还原都是非常好的。