欢迎光临散文网 会员登陆 & 注册

URP | 后处理-Bloom效果

2023-03-04 16:33 作者:那个人真狗  | 我要投稿

后处理部分快完结了,

前看目录

这部分前面是原来制作的一部分,参考

游戏 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库文件。


总结

  1. 梳理Bloom的流程,学习到了都分几步部分实现,官方流程也是4个Pass 不同的是 官方 第一个Pass提取亮度 第二个,是水平模糊 第三个是垂直模糊,第四个是 上采样。

2. 难点是在 降采样和升采样,我这里可能处理的比较复杂,目前没有能力优化的更好。

3. SetGlobalTexture 的使用,可以将纹理设置为全局纹理 。




资料

绽放 (catlikecoding.com)

【Unity】代码实现后期处理Bloom效果 | SuzhiのBlog (1keven1.github.io)

Bloom_哔哩哔哩_bilibili

从认识到实现:HDR Bloom in Unity - 知乎 (zhihu.com)


URP | 后处理-Bloom效果的评论 (共 条)

分享到微博请遵守国家法律