手机上Bloom效果trick

来源:互联网 发布:云烟淘宝客鹊桥助手 编辑:程序博客网 时间:2024/05/24 07:21
这篇不讲具体bloom本身的算法,讲的是如何获得需要bloom的亮部颜色信息。

这年头手机上很多3D arpg/mmorpg都在高级效果中加入bloom了,因为好看嘛。不过绝大部分游戏的bloom效果都是那种全屏大部分地方都泛光,造成整个画面过曝以及模糊,虽然这种效果应用在偏向卡通渲染的画面上看起来还是挺不错的,而且也符合国人喜欢的“特效就是要亮瞎人狗眼”的画风,咳咳。。。但是这种东西在相对写实的画面上面效果并不好。

造成这种结果的原因也很简单,就是没使用HDR,也就是说迫不得已必须将bloom的阈值设到低于1.0的程度,这样自然画面很多地方都会被bloom了,尤其是脸部,亮度本身就会很高,很容易被bloom了,细节全无。

解决方法:
一种方法就是让不该bloom的地方不要bloom,比如说我只需要主角的装备bloom,而脸部,头发,场景等都不需要bloom,这样的话会大幅度减少bloom的地方,画面效果好很多,具体方法可以使用stencil buffer来做,想要bloom的mesh给写一个值进去,最后bloom的时候值不对直接fail。

第二种方法效果会更好一些,但是也更费一些。毕竟上面的方法bloom的阈值还是比较低,需要美术同学做精心的调教才能达到好的效果,最好的方法还是有HDR才行。
因为手机上不好用HDR(当然,这年头高端手机开HDR已经没有问题了,比如UE4引擎已经帮忙搞定HDR的问题了,包括在一些不支持真HDR的手机上,引擎也做了另外的方案储存HDR信息),可以考虑将HDR的信息单独储存起来,方法是将计算好的color的亮度摘出来,然后取对数(用来减小范围),最后将这个亮度信息储存到alpha通道上,最后在bloom的时候,将这个亮度信息再decode出来,这样就相当于有HDR了。这种RGBE的存储方案已经运用到了多种地方,比如光照图来存HDR信息等等。
当然,这个可能需要额外的rendertarget,以及额外的pass来渲染。比如,只有主角有bloom的话,可以将主角再渲染一遍,最后存储到另外的rt上,镇魔曲手游使用的就是这个方法,也可以考虑使用multiple rt,这样只需要渲染一遍就行。