URP | 后处理-Bloom效果
后处理部分快完结了,
前看目录

这部分前面是原来制作的一部分,参考
游戏 Bloom 实现方法 - 哔哩哔哩 (bilibili.com)
Unity 官方的Bloom就已经很好了,这里只是学习方法原理
目的
Bloom的基本原理与效果
Bloom与HDR的关系
Bloom在URP中的实现过程
实现效果

Bloom基本原理
详细介绍
游戏 Bloom 实现方法 - 哔哩哔哩 (bilibili.com)
这里直接制作过程

制作过程
这里直接URP实现 ,
这是Unity 默认

我们以这个效果为参考.
RendererFeature
前准备一个基础的后处理管线,可以实现Shader的效果,
基础管线我们处理完成就,实现基础的显示Shader,我们接下来我们处理Shader。
Shader
因为我们的bloom分 4部分来,处理大部分都是在Shader阶段处理。
Shader 部分的分成4个步骤流程
获取当前图像亮度高的区域
Box模糊
使用叠加模式 和 Box模糊
模糊后的图叠加到原图
定义一个基础Shader
这个Shader 是一个反色效果,是检查我们当前的管线是否正确。
这里Shader我们准备执行4个Pass来处理我们的不同阶段。
1. 提取亮部信息
第一个Pass 类提取亮部信息。
定义一个函数 来提取亮部信息
在Pass里,使用函数 提取输入的亮度信息。
Shader 第一个Pass 是提取亮度信息
在后处理组件中增加控制变量。
在后处理中增加我们的控制属性
RendererFeature 中 来绑定我们的数据信息
管线中增加后处理关联
效果

我们提取屏幕中颜色信息大于0.8 的数据
可以调整后处理中 Threshold数值控制提取亮部信息的大小

第一个Pass我们就算完成,我们看到有2个阶段,

2. 模糊算法
我们新建一个Pass 来处理模糊,我们使用Box模糊方法
定义一个函数 来方便我们调用
注意:这里 t 是可以控制 模糊的大小
定义一个变量 来在外部控制模糊的大小
全Pass
扩展 _MainTex_TexelSize.xy 和 _MainTex_ST 的区别
_MainTex_TexelSize
是贴图 _MainTex 的像素尺寸大小,值: Vector4(1 / width, 1 / height, width, height)
_MainTex_ST
是贴图_MainTex的tiling和offset的四元数
_MainTex_ST.xy 是tiling的值
_MainTex_ST.zw 是offset的值

3. 模糊和亮度叠加
为什么需要两个模糊,第二个模糊是叠加模式 ,我们Bloom是有一个降采样和升采样的过程,这样优化叠加方式。
URP | 后处理-模糊算法总结 - 哔哩哔哩 (bilibili.com)
修改叠加模式的Pass
我们第三Pass算完成了。接下来处理第四个Pass,把模糊完的图和远场景的图进行叠加输出
4. 合并输出
最后面一个Pass 来处理 原图和 模糊后的图进行合并。
shader部分完成,准备4个Pass ,我们当前是按照好理解的来处理,后面会合并优化。
RendererFeature 实现效果
第一部分
提取亮度的Pass
Render
定义一个RT 来提取后面
这个部分就是获取亮度信息,和上面的一样。
后处理Volume 这里我们定义 控制降采样的 次数 和控制模糊
第二部分
进行降采样和升采样
获取上面的信息进行降采样,实现模糊的效果,将源纹理降低一半分辨率,在使用降低一半的纹理放大到原始分辨率,就实现了模糊效果。
我们前把提取亮部信息的代码注掉。
这部分可以查看怎么实现的降采样方法。
注意:调用完RT 需要ReleaseTemporaryRT 进行释放。
效果

我们设置4次效果,执行8次,4次降采样 4次升采样。
合并输出
显示出提取亮度,我们发现输入的素材不是用来的素材图,所以获取用来的图进行合并。

在Shader中获输入的图片,储存到destination
SetGlobalTexture
SetGlobalTexture 是 Unity 中的一种方法,可以将纹理设置为全局纹理,可以在着色器代码中被调用,或者在其他方法中使用。它接受两个参数:第一个参数是全局纹理的名称,第二个参数是要设置的纹理。
Shader 里的全局属性和局部属性,
增加到Properties 就是局部属性,Shader里使用
没有在 Properties 里就是 全局属性
注意:第4个Pass _SourceTex 是全局变量,不要增加到 属性里。
查看Debug

全代码
效果
到这里就算全实现完成

整合
我们把Shader整合一下,分成两部分 第一个分 pass 第二部分是 hlsl库文件。
总结
梳理Bloom的流程,学习到了都分几步部分实现,官方流程也是4个Pass 不同的是 官方 第一个Pass提取亮度 第二个,是水平模糊 第三个是垂直模糊,第四个是 上采样。

2. 难点是在 降采样和升采样,我这里可能处理的比较复杂,目前没有能力优化的更好。
3. SetGlobalTexture 的使用,可以将纹理设置为全局纹理 。
资料
绽放 (catlikecoding.com)
【Unity】代码实现后期处理Bloom效果 | SuzhiのBlog (1keven1.github.io)
Bloom_哔哩哔哩_bilibili
从认识到实现:HDR Bloom in Unity - 知乎 (zhihu.com)