【Unity Shader​】 屏幕后处理5.0:讨论双重模糊的Bloom

news2024/11/30 2:50:51

接上一篇基于高斯模糊的Bloom继续进行接下来的学习。


1 一些必要的思考*

1.1 关于高质量Bloom

前面提到了,Bloom对于游戏必不可少的效果之一,于是我们不仅仅要把Bloom效果实现出来,效果的质量好坏就更加是我们需要关注的点了。高质量泛光(bloom)从理论到实战这篇文章中对高质量、高品质的Bloom做了三点定义,我就直接把原话搬过来了:

  • 发光物边缘向外“扩张”得足够大
  • 发光物中心足够量(甚至超过1.0而被clamp成白色)
  • 该亮的地方要亮,不该亮的地方不亮

这篇文章逻辑非常清楚,从实现高品质Bloom出发,介绍了如何利用HDR实现快速的大范围模糊、如何保证中心的高亮区域、以及如何处理泛光的方块图样、闪烁等问题,值得一看!

1.2 关于Kawase模糊

不同于【Unity Shader】屏幕后处理3.0:均值模糊和高斯模糊中实现的均值模糊(Box Blur)和高斯模糊(Gassian Blur),Kawase模糊的kernel会随迭代次数移动,而不是固定的:会对当前像素越来越远的四个角进行采样(黑点向四个方向偏移成四个采样点),且在两个相同大小的纹理之间进行乒乓式的Blit:(图来自高品质后处理:十种图像模糊算法的总结与实现 - 知乎 (zhihu.com))

Kawase模糊实现的效果跟高斯模糊差不多,且性能要优于高斯模糊。

2 新的模糊思想:双重模糊

2.1 Unity中实现Bloom的过程

上一篇博客中我用Unity自带Bloom实现效果跟高斯模糊实现的效果做了个对比,下面我们再Frame Debug一下,看看到底是怎样的一个过程:

可以发现Unity自带Bloom的实现是有一个先降采样再升采样的过程,跟之前我实现Bloom的方式多了一步升采样,得到的效果也会比仅降采样的效果好。

2.2 双重模糊思想

那么上面提到的先降采样再升采样的方法,就是一种新的模糊思想——双重模糊(Dual Kawase Blur,简称Dual Blur),它是SIGGRAPH 2015上ARM团队提出的一种衍生自Kawase Blur的模糊算法(是参考这篇文章的说法),所以会叫做Dual Kawase Blur。

但现在我认为与其说双重模糊是一种具体的模糊算法,不如说它是一种先降后升的模糊思想,它不仅可以基于Kawase Blur,还可以基于Box Blur、Tent Blur(两次Box Blur)或是Gaussian Blur,取决于在Blit的过程中选择哪种Blur算法。

根据实时渲染学习笔记—光晕效果(bloom)过程:将全分辨率原图采样为不同更小分辨率的纹理以扩大模糊范围,将这些图片升采样为原分辨率大小的纹理并叠加到原图上,实现大范围的Bloom效果。

升降采样的插值和滤波

为什么会有这个疑问呢?因为我发现,在c#脚本中,即使是分辨率不同的纹理之间的跨度也还是简单的:

Graphics.Blit(rt0, rt1, Material, 1); //假设rt0和rt1分辨率不相同

那么分辨率高->低or低->高到底是如何重建的?我一直很模糊,通过大量搜索(例如在做降采样处理时,是先滤波,还是先降采样,二者有区别吗?),我简单理解的生/降采样中插值和滤波之间的关系应该是:

  • 降采样——先滤波(选择的滤波方法),后插值(抽取值)
  • 升采样——先插值(内插值法,插入若干0值),后滤波

我不确定这样的说法是否绝对正确,不过这样想的话也是能解决我的困惑的。

2.3 优点

与之前相比这个方法得到的Bloom效果有这样三种优点:

模糊范围扩大得更好

这里对应着上述提到的缺点1性能问题,双重模糊的降采样很好得解决了这个问题,达到了模糊范围扩大又好控制、又节省性能的效果。这个时候如果你想说:好像上面的方法里也有用到降采样呀?两者有什么区别?我们不妨看看上面方法是如何体现降采样的:

int rtW = source.width / downSample;
int rtH = source.height / downSample;
//定义rt
RenderTexture rt0 = RenderTexture.GetTemporary(rtW, rtH, 0);
rt0.filterMode = FilterMode.Bilinear;

明不明显!这里相当于在进行Blit之前只是简单的对源图像降低了分辨率,仅此而已!并没有生成一个个mip层、没有形成一个像Mipmap一样的“图像金字塔”。

淡化了最终效果的边界感

降采样扩大了模糊范围后,如果只是单纯的把下采样的最高Mip层级叠加到的源图像上,得到的结果会是一种界限分明的效果,我们借用这篇文章里的只进行下采样的效果:

过渡得如此突兀显然不是我们想要的,于是就来到了双重模糊的第二个要点——升采样。我们不仅仅把最高Mip层叠加到原图,而是把每一层叠加到一起,这样过渡的就会非常自然,且中间部分该亮的也会亮度合适:(图还是引用上面提到的文章内容)

提升了性能

这种方法为什么可以提升性能?——我们可以在低分辨率图像上进行小范围滤波,进而达到在高分辨率图像上大范围滤波等价的效果,比较而言性能当然有所提升。

3 总结不同方法使用blur kernel

双重模糊的实现主要体现在两点:

  • 降采样
  • 升采样

我大概列举一下我能看到的一些文章里实现这两步的方法。

3.1 采用高斯模糊

高质量泛光(bloom)从理论到实战这篇文章中最开始降采样和升采样都是用的5X5的高斯滤波盒。

【Free Bird/URP教学】11.双重模糊 - 知乎 (zhihu.com)这篇文章也是采用的纵横的高斯模糊。

3.2 《使命召唤》的思路

《使命召唤:高级战争》中介绍了更好的双重模糊的思路,采用了优化后的降(下)采样和升(上)采样滤波器。

为了进一步提升性能介绍了更好的滤波盒,(下面的图片保存自高质量泛光(bloom)从理论到实战,实际出处:Advances in Real-Time Rendering in 3D Graphics and Games - SIGGRAPH 2014,详细PPT参考:NEXT GENERATION POST PROCESSING IN CALL OF DUTY: ADVANCED WARFARE)

降采样:更巧妙的kernel

该方法中,降采样采用了下面这种2X2这种采样模式,如动图所示一共采样了5组(剔除重合采样点一共有13个需要进行纹理查询的采样点),整个过程可以理解为5个“4次双线性纹理查询平均值”的加权平均和。文章实时渲染学习笔记—光晕效果(bloom)更加清楚了介绍降采样的方式,可自行查看。

上采样:tent kernel

(本小节的叙述主要参考了实时渲染学习笔记—光晕效果(bloom))

我们已经理解了所谓的上采样就是将降采样得到的
N个Mip层的图像还原到原图像分辨率大小,每将一个Mip层还原分辨率,还要进行一次滤波,意味着一共要进行N次高斯滤波,代价是很大的。

该方法选择了用简单的tent kernel,并采用了一种渐进的采样方式:图中一共有5个Mip层,从最高的第5Mip层出发,Mip5重构到Mip4的分辨率,再与原先的Mip4叠加;叠加后的Mip4重构到Mip3分表率,再与原先的Mip3叠加,以此类推。

更值得注意的是,他们提出了一个radius parameter来控制范围,卷积核的权重值不再是“一个萝卜一个坑了”,核中间有一个“洞”, 类似卷积里的空洞卷积(总结-空洞卷积(Dilated/Atrous Convolution)),更加降低了计算量。

3.3 采用Kawase模糊

参考了高品质后处理:十种图像模糊算法的总结与实现,基于两种不同的kernel:

其核心思路在于会在Blit的过程中对RT进行降采样和升采样,就像下图:

3.4 基于简单的Box Blur

【Shader】后处理之模糊算法这篇文章采用的是基于简单均值模糊的双重模糊。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/41335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试宝典之C++多态灵魂拷问

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、重载,隐藏/重定义,覆盖/重写二、多态的原理三、inline可以是虚函数吗四、静态成员函数可以是虚函数吗五、构造函…

海丝一号-中国-2020

2020年12月22日,由中国电科38所和天仪研究院联合研制的我国首颗商业SAR卫星“海丝一号”搭载长征八号运载火箭在文昌卫星发射中心成功发射。海丝一号历时一年完成研制,整星重量小于185kg,成像最高分辨率1m,可以全天时、全天候对陆…

章节5 文件与目录管理

5-Linux文件和目录管理 (Linux操作系统-2022的前面章节都为铺垫) 常见命令格式 Command Options Arguments 命令 选项 参数 rm -rf /* -一个字母或字母组合,此选项为短选项,–单词,此选项为长选项 Options选项&…

因果推断 | 双重差分法笔记补充

换了新的环境后,一直在适应(其实是一直被推着走),所以停更了笔记好久啦。这一周周末终于有点得空,当然也是因为疫情,哪里都不能去,哈哈,所以来冒个泡~ 整理了最近pre的作业&#xf…

ESP32-CAM初始篇:Arduino环境搭建-->实现局域网推流

ESP32-CAM初始篇:Arduino环境搭建–>实现局域网推流 入手产品:安信可科技:ESP32-CAM摄像头开发板: 相关产品特性请访问安信可ESP32-CAM官网:https://docs.ai-thinker.com/esp32-cam 第一步:下载Ardui…

基于51单片机数字频率计的设计

目录 前 言 1 第一章 总体设计方案 2 1.1 总设计框图 2 1.2 硬件设计分析 2 1.2.1 电源的设计 2 (4):LCD1602的指令说明及时序 10 (5): LCD1602的RAM地址映射及标准字库表 13 第二章 软件设计与分析 15 2.1…

谷粒商城十一商城系统及整合thymeleaf渲染商城首页

我们的商城系统本应该也是前后端分离的,就像后台管理系统那样,然而出于教学考虑,前后端分离的话就会屏蔽掉很多细节,所以我们进行服务端的页面渲染式开发(有点儿类似freemarker) 这些页面直接粘贴到微服务…

含论文基于JSP的零食销售商城【数据库设计、源码、开题报告】

数据库脚本下载地址: https://download.csdn.net/download/itrjxxs_com/86500759 主要使用技术 ServletJSPcssjsMysqlTomcat 功能介绍 (1)前台功能模块: 注册登陆:顾客可以通过填写注册信息成为会员,登陆后才能进行购物车的管…

汽车 Automotive > SOME/IP应用学习

目录 SOME/IP介绍 SOME/IP主要功能 SOME/IP协议 SOME/IP服务类型 SOME/IP-举例 SOME/IP各模块协议 SOME/IP-基础元件 SOME/IP-SoAD SOME/IP-SD协议 SOME/IP-SD举例 SOME/IP-TP协议 SOME/IP-TP举例 SOME/IP介绍 SOME/IP ( Scalable service-Oriented Middleware ove…

基于Android的JavaEE课设

目录 1 技术栈 2 android前端 2.1 概述 2.1.1 目录结构 2.1.2 代码分层 2.2 技术点 2.2.1 数据绑定 2.2.2 前后端数据交互 2.2.3 九宫格图片 2.2.4 未处理消息提醒 2.2.5 动画效果 2.2.6 实时聊天 2.2.7 文件上传 2.2.8 底部弹窗 2.2.9 其他 3 后端 3.1 概述 …

BUUCTF Misc 假如给我三天光明 数据包中的线索 后门查杀 webshell后门

假如给我三天光明 下载文件,一个压缩包(需要密码)和图片 百度得知下面一行是盲文,根据盲文对照表 和上述图片对照,得到字符串:kmdonowg 。使用它解压压缩包 使用Audacity打开 转换成摩斯密码,…

C语言程序设计 复习总结[持续更新ing]

目录 一 初识C语言 1 main 主函数 2 注释 3 C 程序执行的过程: 4 C 程序的结构 5 进制的转换 1.内存容量 2.二进制与十进制的转换 1>将二进制数转换成十进制 2>将十进制转换成二进制数 3.二进制与八进制的转换 1>将八进制数转换成二进制: 2>将二进…

Java项目:JSP酒店客房管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 酒店管理系统共分为三个角色,客房经理、前台管理员、客户,各个角色的权限各不相同; 客房经理功能包括&#…

leetcode《图解数据结构》刷题日志【第五周】(2022/11/21-2022/11/28)

leetcode《图解数据结构》刷题日志【第五周】1. 剑指 Offer 60. n 个骰子的点数1.1 题目1.2 解题思路1.3 数据类型功能函数总结1.4 java代码1.5 踩坑小记1.6 进阶做法2. 剑指 Offer 63. 股票的最大利润2.1 题目2.2 解题思路2.3 数据类型功能函数总结2.4 java代码3. 剑指 Offer …

SpringBoot SpringBoot 原理篇 1 自动配置 1.16 自动配置原理【2】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.16 自动配置原理【2】1.16.1 看源码了1.16.2 Import({AutoConfig…

archlinux 安装matlab

最近在学matlab使用的是windows版本的,比起windows我更喜欢在linux中写代码。于是乎就想在Linux中安装一下。 主要过程参考此篇文章: 《【首发】 ubuntu20.04安装matlab2021b/matlab2020b》 https://blog.csdn.net/hanjuefu5827/article/details/1151677…

【Hack The Box】Linux练习-- Forge

HTB 学习笔记 【Hack The Box】Linux练习-- Forge 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 &#x1f36…

队列(C语言实现)

文章目录:1.队列的概念2.队列的结构3.接口实现3.1初始化队列3.2判断队列是否为空3.3入队3.4出队3.5查看队头元素3.6查看队尾元素3.7统计队列数据个数3.8销毁队列1.队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特…

jQuery插件【validate】国际化校验插件

jQuery插件系列 相信大家在网站上都遇到过这种注册的情况吧,有的时候我们什么也不输入点登录或者注册或者鼠标失去焦点的时候,就会自动提示xxx为空,密码不正确,请输入xxx等一系列的提示信息。 那么这是怎么实现的呢,其…

【LeetCode】No.101. Symmetric Tree -- Java Version

题目链接:https://leetcode.com/problems/symmetric-tree/ 1. 题目介绍(Symmetric Tree) Given the root of a binary tree, check whether it is a mirror of itself (i.e., symmetric around its center). 【Translate】: 给定…