泛光(bloom)总结

前言

​ 本篇会介绍什么是泛光(bloom)、眩光及形成原因,会介绍基础的实现泛光的流程

镜头眩光

  • 镜头眩光(Lens flare)定义:由于眼睛的晶状体或者相机的透镜直接面对强光所产生的一种现象,由一圈光晕(halo)和纤毛状的光环(ciliary corona)组成

  • 原理:光晕的出现是因为透镜物质 (如三棱镜)对不同波长光线折射数量的不过而造成的,看上去很像是光周围的一个圆环外圈是红色,内圈是紫红色。纤毛状的光环源于透镜的密度波动,看起来像是从一个点发射 出来的光线。Lens flare 是近来较为流行的一种图像效果,自从我们认识到它是一种实现真实感效果的技术后,计算机便开始模拟此效果

  • image-20230331195434900

泛光

  • 泛光(Bloom)定义:泛光是由于眼睛晶状体和其他部分的散光而产生,在光源附近出现的一种辉光.在现实世界中,透镜无法完美聚焦是泛光效果的物理成因;理想透镜也会在成像时由于衍射而产生一种名为艾里斑的光斑
    image-20230331232235891
    下面是一个使用了和没有使用光晕的对比
    image-20230331232504820
  • 泛光和HRD是不同的:常见的一个误解便是将 HDR 和 Bloom 效果混为一谈。Bloom 可以模拟出 HDR 的效果,但是 原理上和 HDR 相差甚远。HDR 实际上是通过映射技术,来达到整体调整全局亮度属性的(颜色,强度等),而 Bloom 仅仅是能够将光照范围调高达到过饱和,也就是让亮的地方更亮。不过 Bloom 效果实现起来简单,性能消耗也小,却也可以达到不错的效果。但Bloom和HDR结合使用效果是非常好的

泛光的实现

  • 实现泛光的大致思路:提取场景的HDR颜色缓冲和只有该场景中明亮区域可见的图片。再模糊提取的带有亮度的图片,将结果添加到HDR场景
    image-20230401145323935

​ 举个例子,假设我们渲染四个不同颜色的光源,且光源亮度在[1,15]间,渲染场景如下
image-20230401143345229

那么对光源的泛光实现如下:

  1. 得到HDR的颜色缓冲,针对该颜色缓冲提取所有超出一定亮度值的片元
    image-20230401154517739
  2. 对这些超出亮度值的纹理进行高斯模糊。模糊分两步,先对纹理进行横向模糊,再在横向模糊基础上进行纵向模糊
    image-20230401144659787
  3. 将这些模糊的纹理替换原来的纹理
    image-20230401144807769
  • 注意:泛光的实现并不难,但难在获得正确的效果,因为泛光的质量取决于所用的模糊过滤器的质量和类型

图像模糊

图像模糊算法描述:针对源对象的每个像素\(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\)的权值矩阵称作模糊核(可理解为卷积核)
image-20230401161422316

高斯模糊

  • 高斯模糊(Gaussian blur)的定义:高斯模糊基于高斯曲线,高斯曲线通常被描述为一个钟形曲线,中间的值达到最大化,随着距离的增加,两边的值不断减少,它的函数表达式\(G(x) = exp(-\frac{x^2}{2\sigma^2})\),使用高斯函数可以获取权值(需要保证权值和为1)。如下图所示,可以看到\(\sigma\)越大,曲线越平缓,赋予的权值也越大

  • image-20230401162439545

  • 求权值的实例。假设我们进行\(1 \times 5\)的高斯模糊,\(\sigma = 1\)

    1. 求G(x),并求和
      image-20230401163250285
      image-20230401163314279
    2. 计算权值
      image-20230401163745342
  • 分离性:若对模糊核为9x9的进行2d的模糊计算,计算样本是81个。但若分离为两个1d模糊计算,仅需处理18个样本

reference

[泛光 - LearnOpenGL CN (learnopengl-cn.github.io)](https://learnopengl-cn.github.io/05 Advanced Lighting/07 Bloom/)

QianMo/Game-Programmer-Study-Notes: 我的游戏程序员生涯的读书笔记合辑。你可以把它看作一个加强版的Blog。涉及图形学、实时渲染、编程实践、GPU编程、设计模式、软件工程等内容。Keep Reading , Keep Writing , Keep Coding. (github.com)

Directx12 3D 游戏开发实战

posted @ 2023-04-01 16:49  爱莉希雅  阅读(1160)  评论(0编辑  收藏  举报