【百人计划】图形4.1 Bloom算法

笔记部分>>

实现Bloom效果

一、什么是Bloom?

一种模拟摄像机的辉光效果,让物体产生像现实生活中真实的明亮。

二、相关的概念:HDR和LDR;

HDR:高动态范围图像

LDR:低动态范围图像

LDR

·8位精度

·范围在(0,1)之间

·常见格式:PNG,JPG;

HDR

·超过8位精度 >256

·范围超过1

·常见格式:HDR,EXR;

因为计算机只有(0,1)的可视范围,而为了更好的呈现和更丰富的细节,只有HDR才会有超过1的范围和Bloom效果

三、如何实现Bloom?

概述:用一个阈值提取出当前渲染图像中较亮的部分,对该区域进行高斯模糊操作,用于模拟光的扩散,叠加到当前图像上。

四、Bloom的应用

1.配合自发光贴图,实现自发光的辉光。

2.配合特效、提升视觉效果。

3.配合ToneMapping色调映射,保留辉光的同时能增加更多细节。

4.配合GodRay 径向模糊。

5.以上都可以混合使用。

作业部分>>

如何实现Bloom Mask,让Bloom只在想要的地方作用?

思路:本来Bloom的区域是根据明度的阈值提取的,且作用在最后的屏幕空间,如果自定义的话,最开始的思路就是将自定义的Mask/渲染图替换或者乘以原来的亮度提取结果。

①自发光贴图和Emissive:似乎是最简单的想法,就是从源头控制:有的角色Shader会有自发光贴图,用一个自定义的Emissive控制自发光的强度。调整阈值,就可以实现针对某个Material的Bloom控制。

②渲染一张特定图,作为黑白Mask乘原本的阈值图:

1.在MainCamera下新建一个子相机,挂载脚本。

2.在脚本里设置当前Camera的camera组件信息,即继承Main Camera的属性,position,rotation等,设置背景为纯黑色。

3.逐帧更新,替换渲染Shader;

4.编辑渲染Shader,设置渲染标签和对应的输出,"BloomEffect"返回1,"NoEffect"返回0,子相机渲染的结果输出到一张RT中,

由之前的Bloom脚本传给BloomShader,作为Mask*第一个Pass里提取出来的亮度阈值。

[测试了一下用Layer的方法,似乎是不行,因为会完全剔除,不会保留遮挡关系,不知道如果设置多个Layer会不会不太现实,Layer涉及到的问题感觉还挺多的)]

结果是可行的。但是缺点也挺明显:因为返回值是固定的,所以这张遮罩图并不能控制Bloom Mask的大小,细致点来说就是不能在屏幕空间控制Bloom的强弱。

③用自定义Alpha通道做Mask:

上面的缺陷是不能在屏幕空间控制Bloom的强弱,但如果用自定义值Alpha通道的结果输出成RT,就能很好控制Bloom的强弱了,有些地方不需要完全丢失Bloom效果。而且Alpha通道如果不做半透明混合,一般都不会占用,还是很实用的。

Debug的结果如下:

上面是Alpha通道还没被占用的情况,如果用半透明渲染Alpha通道是会被占用的。解决方法是崩崩崩的处理,参考了下面这个博客:大致就是用一个额外的Pass来存储Alpha通道。

(5条消息) Unity 关于仿崩坏3部分Bloom(部分泛光)效果实现原理(附源码)_SnoopyNa2Co3的博客-CSDN博客

一些额外的:

之前在PS有个比较常用的功能是吸取颜色,然后取该颜色的一定阈值范围内进行调色/范围选择。想了想这个需求应该也同样适用于Bloom。就试了试实现。

在C#中新增一个Public Select Color,传入Shade中,更改第一个Pass的阈值计算。

(从某种程度上也可以作为让某种颜色单独产生Bloom的方法)

实现GodRay:

1.和Bloom同样的思路,根据颜色/亮度提取出阈值,即要进行模糊的部分。

2.模糊的原理是径向模糊,通过光在屏幕空间中的位置计算出模糊的方向,将每一个采样的uv沿着模糊的方向进行偏移,达到有方向的模糊的效果。

3.照常将模糊后的图片和原图进行叠加。

[看了示例的Shader,用的好像是光的Transform组件,通过Camera.WorldToViewportPoint拿到光在屏幕空间中的位置]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值