BLOOM

Bloom:

       由于显示器的颜色显示范围有限以及强光区域发光的地方时常会有光晕的效果,而在之前的着色器中片段颜色是逐个定义的,没有泛光的效果。如果有一张在阳光下的白纸,白纸在监视器上显示出是出白色,而前方的太阳也是纯白色的,所以基本上白纸和太阳就是一样的了,给太阳加一个光晕,这样太阳看起来似乎就比白纸更亮了。

 

  要实现上面的泛光效果,需要对渲染结果进行后期处理。这里还是采用延迟渲染的方法把前面的渲染结果先存放在帧缓冲当中。然后可以得到一张存放了渲染结果的帧缓冲贴图。

  但这是之前的做法,现在需要在帧缓冲中加入另一个输出,对高亮区域进行分离,得到一张新的光晕区域贴图,对这部分贴图进行模糊后与原图像混合即可得到泛光的效果,这中间模糊算法有很多种,先采用一种比较间的的高斯模糊。

       下面这张图能大概的概括整个流程。

 

  首先在程序中定义一个用于存放渲染结果的帧缓冲来代替原来的默认帧缓冲,做离屏渲染。由于需要输出到两个缓冲中以提取亮色区域,需要为帧缓冲绑定两个输出的贴图,同时在着色器中为他们定义好对应的输出通道。定义帧缓冲部分的代码如下:

  在片段着色器中,定义一个明度的变量用来区分高亮区域和非高亮区域。将他们分别输出到定义好的不同缓冲通道中。

 

 

   做完这些,渲染后可以得到以下的两张贴图:

 

  可以看到,第一张图大概就是第二张图截掉不怎么亮的部分得到的。由于还没有做HDR映射和Gamma转换,第二张图的颜色看起来不太正常,不过由于后面还需要进行模糊和混合操作,这里应该保留这些线性空间的颜色。

      

       下一步就需要对第一张提取出亮色区域的贴图进行高斯模糊。

       关于高斯模糊,这篇文章讲的较为细致:

  高品质后处理:十种图像模糊算法的总结与实现 - 知乎 (zhihu.com)

       取文中的定义:

       高斯模糊在图像处理领域,通常用于减少图像噪声以及降低细节层次,以及对图像进行模糊,其视觉效果就像是经过一个半透明屏幕在观察图像。

从数字信号处理的角度看,图像模糊的本质一个过滤高频信号,保留低频信号的过程。过滤高频的信号的一个常见可选方法是卷积滤波。从这个角度来说,图像的高斯模糊过程即图像与正态分布做卷积。由于正态分布又叫作“高斯分布”,所以这项技术就叫作高斯模糊。而由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波器。

      

       在模糊过程中,由于模糊需要对周围像素进行采样,即类似PBR中计算卷积的方法,采样次数比较多,对性能会产生一定的影响,可以考虑先进行横向卷积,再将其结果进行纵向卷积的方式,获得一样的效果。

 

   首先定义一个用于临时保存卷积结果的帧缓冲,这里实际上是两个,一个纵向和一个横向的帧缓冲。

 

   同时,定义对应的模糊着色器,传入贴图为分离出来的高亮区域贴图。

  进行模糊后,可以得到下面的模糊贴图:

 

       可以看到,原本高亮的区域都被施加了模糊的效果,同时,光线集中的区域也有了一种光线向外溢出的感觉。这样就有了泛光的效果,得到泛光贴图后,就可以对原图进行混合。混合的过程也比较简单,对两个贴图颜色相加几个。最后,还是要进行hdr映射和gamma矫正,使颜色重新回到比较正常的状态。

       最后进行延迟渲染的最后一步,对帧缓冲中的内容进行渲染。可以得到下面的结果。

左侧是未开启bloom的效果,右侧是开启bloom的效果。

 

 

 

posted @ 2022-08-20 00:19  _LH2000  阅读(213)  评论(0编辑  收藏  举报