![b4fa1e4482f00190bc00f29e1d2e6ee7.png](https://img-blog.csdnimg.cn/img_convert/b4fa1e4482f00190bc00f29e1d2e6ee7.png)
Bloom在游戏中是一种比较常见的效果,是通过后期处理的方式,来达到模拟现实生活中物体在强烈光源照射下,出现“光晕”的效果。本着学习,举一反三的精神,本文将探讨几个问题:
- Bloom的基本原理与效果
- Bloom与HDR的关系
- Bloom的美术意图
- Bloom在Unity中的基本实现
一、Bloom的基本原理与效果
![d861ee500620a8c87591e290dfdd7d46.png](https://img-blog.csdnimg.cn/img_convert/d861ee500620a8c87591e290dfdd7d46.png)
拿我之前做的一个小恐龙作为本文的模特,这个就是最终的效果(Unity 的Post process stack 中的bloom),如果关闭bloom
![9c40cec4087f11a1255814cfc076dfe0.png](https://img-blog.csdnimg.cn/img_convert/9c40cec4087f11a1255814cfc076dfe0.png)
两张图的最明显的地方,则在于上图阳光洒下的地方,会产生强烈的光晕,这个就是bloom效果,大家也常叫这种特效辉光。
接下来,动手在ps里面,拿一张图片,手动的模拟一下这个过程,感性的认识一下原理:
PS:这个过程只是可视化的展示一下原理,结果不准确
之前说了一组重点词,我提取出来:”强烈光源照射下,出现的效果“,”阳光洒下的地方“。我们干的第一件事情就是找出”阳光洒下的地方“也就是受光部分:
先通过色阶,找出图像中的受光(亮度更高的区域):
![0b0726e41e0469de5522eed262f4c11f.png](https://img-blog.csdnimg.cn/img_convert/0b0726e41e0469de5522eed262f4c11f.png)
接着,将这部分作为选取,复制出这个选取的原图(不是这个调整过色阶的图)
![40da7515de304bec6876f32bd04220be.png](https://img-blog.csdnimg.cn/img_convert/40da7515de304bec6876f32bd04220be.png)
![4bc93b02ed8b5db380a9b0585d6a82ba.png](https://img-blog.csdnimg.cn/img_convert/4bc93b02ed8b5db380a9b0585d6a82ba.png)
![72581f8961cc696d2592b520aeb6945b.png](https://img-blog.csdnimg.cn/img_convert/72581f8961cc696d2592b520aeb6945b.png)
通过选取复制出来之后,这就是基本上这张图上的受光情况,这就是我们需要bloom的区域,接下来,将这个图层做一次高斯模糊。
![4a1fe6e820293439e603bb68d9567a82.png](https://img-blog.csdnimg.cn/img_convert/4a1fe6e820293439e603bb68d9567a82.png)
我这里随便拉一下,得到一张模糊后的图像,最后一步,将这个图像与原图相加即可(调整图层混合模式为 线性减淡(线性减淡就是与下层图像进行相加):
![f29271c37ab1bc4fb4edaeedacf8f636.png](https://img-blog.csdnimg.cn/img_convert/f29271c37ab1bc4fb4edaeedacf8f636.png)
为了清晰,我把这里的名字重新做了梳理,从下至上的处理过程,其实Bloom的实现也是这么个流程。
最终我们的到了这样一张:
![10342e68ad9b3569c5a72154024fb997.png](https://img-blog.csdnimg.cn/img_convert/10342e68ad9b3569c5a72154024fb997.png)
![a44f82864ff1cad2bf5d41cbea4aa3d2.png](https://img-blog.csdnimg.cn/img_convert/a44f82864ff1cad2bf5d41cbea4aa3d2.png)
为了效果强烈一些,我多复制了一层并且透明度减少了50%,与原图做一个对比。这样,我们也得到了一个看起来略显廉价,但是也保留了主要特征的bloom,我们在与unity post process stack里面的bloom做一下对比:
![ab1338a15ca10380bc6c67218989a0bd.png](https://img-blog.csdnimg.cn/img_convert/ab1338a15ca10380bc6c67218989a0bd.png)
导致这样的问题是因为 Unity 进行bloom特效时,所拿到的原始数据精度要远高于QQ截屏下来图像,请记住这个廉价的效果,后期会用到,不过再实际编码过程中处理的流程其实一样的。
梳理一下:bloom其实就是拿到一张图像,对期望区域进行模糊处理,再加回到原图,最后输出。
二、Bloom与HDR
刚做这行不久的时候,其实HDR(High Dynamic Range)这个名词总是会频频出现,尤其是与Bloom也常常绑定着一起出现。所以一直以来心中都有一个疑问,到底该怎样理解HDR,它与Bloom又有着什么样的关系?本章的重点是形象的理解,而非上来就是”高动态范围“这些初次看见就想骂娘的解释。我们挑战一下这个课题。
我们先做这么一个实验,在引擎里始终打开bloom,在HDR和非HDR的环境下观察效果。
![b6ae660c4761df0b3db8fc8980cd71ab.png](https://img-blog.csdnimg.cn/img_convert/b6ae660c4761df0b3db8fc8980cd71ab.png)
我们看到左边的HDR使用的是Use Graphics Setting 由于我们的目标平台为PC所以在Graphics Setting里面默认是使用HDR的。(这里的版本是Unity 2019.2.4f1)
![02536a06df3543d6ffbde4c786abab9d.png](https://img-blog.csdnimg.cn/img_convert/02536a06df3543d6ffbde4c786abab9d.png)
先来观察打开HDR的图像,是这样的:
![646f6b77148cf7153a3932e2bff4c11a.png](https://img-blog.csdnimg.cn/img_convert/646f6b77148cf7153a3932e2bff4c11a.png)
我们再次关闭HDR,观察图像,是这样的:
![71fd3cb488dadc4e37c08ba850dc7da4.png](https://img-blog.csdnimg.cn/img_convert/71fd3cb488dadc4e37c08ba850dc7da4.png)
Bloom始终打开,但在HDR与非HDR(LDR)的两者环境下的图像,受光部分出现了比较强的反差,没有HDR支持的小恐龙受光部分的光晕弱了很多,那是什么导致了这样的原因?还记得之前在PS里面处理的廉价版的Bloom图像吗?是不是很像?我拿出来做一下对比
![8dd467bdcd36b1a82c79b071cd94b74a.png](https://img-blog.csdnimg.cn/img_convert/8dd467bdcd36b1a82c79b071cd94b74a.png)
所以我们可以得到一个初步的判断,非HDR下bloom所处理的图像,跟我们人手QQ截图下来送进ps里的图像,基本是一样的。那为什么HDR下的效果会如此强烈?是什么导致了这样的反差?上面也说过,是两者处理时使用的数据精度不一样所造成的。那要如何形象的理解这里的精度不一呢?我认为如果形象的理解了这个精度,那么对于得到这两个结果的不同就豁然开朗,如下图:
![075bc72f5a53423f50746596ef89d26d.png](https://img-blog.csdnimg.cn/img_convert/075bc72f5a53423f50746596ef89d26d.png)
我们就先用一个亮度的概念来解释:HDR比LDR拥有着更多的亮度。也就是说,HDR跨过了LDR的最大存储容量(每通道8bit,共32bit的