泛光(bloom)总结
前言
本篇会介绍什么是泛光(bloom)、眩光及形成原因,会介绍基础的实现泛光的流程
镜头眩光
-
镜头眩光(Lens flare)定义:由于眼睛的晶状体或者相机的透镜直接面对强光所产生的一种现象,由一圈光晕(halo)和纤毛状的光环(ciliary corona)组成
-
原理:光晕的出现是因为透镜物质 (如三棱镜)对不同波长光线折射数量的不过而造成的,看上去很像是光周围的一个圆环外圈是红色,内圈是紫红色。纤毛状的光环源于透镜的密度波动,看起来像是从一个点发射 出来的光线。Lens flare 是近来较为流行的一种图像效果,自从我们认识到它是一种实现真实感效果的技术后,计算机便开始模拟此效果
泛光
- 泛光(Bloom)定义:泛光是由于眼睛晶状体和其他部分的散光而产生,在光源附近出现的一种辉光.在现实世界中,透镜无法完美聚焦是泛光效果的物理成因;理想透镜也会在成像时由于衍射而产生一种名为艾里斑的光斑
下面是一个使用了和没有使用光晕的对比
- 泛光和HRD是不同的:常见的一个误解便是将 HDR 和 Bloom 效果混为一谈。
Bloom 可以模拟出 HDR 的效果
,但是 原理上和 HDR 相差甚远。HDR 实际上是通过映射技术,来达到整体调整全局亮度属性的(颜色,强度等)
,而 Bloom仅仅是能够将光照范围
调高达到过饱和,也就是让亮的地方更亮。不过 Bloom 效果实现起来简单,性能消耗也小,却也可以达到不错的效果。但Bloom和HDR结合使用效果是非常好的
泛光的实现
- 实现泛光的大致思路:提取场景的HDR颜色缓冲和只有该场景中明亮区域可见的图片。再
模糊
提取的带有亮度的图片,将结果添加到HDR场景
举个例子,假设我们渲染四个不同颜色的光源,且光源亮度在[1,15]间,渲染场景如下
那么对光源的泛光实现如下:
- 得到HDR的颜色缓冲,针对该颜色缓冲提取所有超出一定亮度值的片元
- 对这些超出亮度值的纹理进行高斯模糊。模糊分两步,先对纹理进行横向模糊,再在横向模糊基础上进行纵向模糊
- 将这些模糊的纹理替换原来的纹理
- 注意:泛光的实现并不难,但难在获得正确的效果,因为泛光的质量取决于所用的
模糊过滤器的质量和类型
图像模糊
图像模糊算法描述:针对源对象的每个像素\(P_{ij}\),计算以它为中心的\(m \times n\)矩阵的加权平均值,该加权平均值便是经模糊处理后图像的第i行,第j列的像素颜色,公式如下:
\(Blur(P_{ij}) = \sum\limits^{a}_{r = -a} \sum \limits^{b}_{c = -b}w_{rc} P_{i+r,j+c}\),且权值和为1(大于1会变亮,小于1变暗)
其中,\(m = 2a + 1, n = 2b + 1\)(\(m,n\)只为奇数,保证有中心点),\(a\)为垂直模糊半径,\(b\)为水平模糊半径, \(m \times n\)的权值矩阵称作模糊核(可理解为卷积核)
高斯模糊
-
高斯模糊(Gaussian blur)的定义:高斯模糊基于高斯曲线,高斯曲线通常被描述为一个钟形曲线,中间的值达到最大化,随着距离的增加,两边的值不断减少,它的函数表达式\(G(x) = exp(-\frac{x^2}{2\sigma^2})\),使用高斯函数可以获取权值(需要保证权值和为1)。如下图所示,可以看到\(\sigma\)越大,曲线越平缓,赋予的权值也越大
-
求权值的实例。假设我们进行\(1 \times 5\)的高斯模糊,\(\sigma = 1\)
- 求G(x),并求和
- 计算权值
- 求G(x),并求和
-
分离性:若对模糊核为9x9的进行2d的模糊计算,计算样本是81个。但若分离为两个1d模糊计算,仅需处理18个样本
reference
[泛光 - LearnOpenGL CN (learnopengl-cn.github.io)](https://learnopengl-cn.github.io/05 Advanced Lighting/07 Bloom/)
Directx12 3D 游戏开发实战