Unity 之 后处理实现界面灰度效果 (PostProcessing 实现 | Shader 实现)
前言
在 Unity 中实现后处理效果有两种方式:
一种是通过使用 Unity 官方提供的Post-Processing
插件。
另外一种方式就是使用脚本获取到渲染后帧缓冲区的图像,再通过shader
写后处理的效果,最后合并输出图像到屏幕上。
一,Post Processing
1.1 设置组件
Post Processing 后处理插件的工程配置:Unity 之 Post Processing 后处理不同项目配置(UPR 项目配置)
这里我们用到的只有:Color Grading
色彩调整
此组件可以使一个用到的特效,用于校正镜头中的颜色与亮度,来实现电影或海报效果,可以理解为手机中的何种滤镜。
这个组件设置项很多,此篇文章中介绍的灰度效果只需要使用到一个,那就是:Saturation
饱和度
将Saturation
值调整为-100,则可以实现灰度效果。随便大家一个界面测试一下:
1.2 代码控制
我这里创建了一个Slider
,来动态控制Saturation
饱和度的值。创建代码命名为PostProcessingProfile
将其挂载到场景中PostProcessProfile
的物体上,就可以实现开篇看到的滑动条控制灰度效果了:
具体代码如下,
二,Shader 材质实现
2.1 原理 API
Unity 在摄影机完成渲染后调用的事件函数,允许您修改摄影机的最终图像。
Unity 后处理OnRenderImage
:
在内置渲染管道中,Unity 在摄影机完成渲染后,调用 MonoBehaviours 上的 OnRenderImage,该 MonoBeh aviours 作为已启用的摄影机组件附加到同一 GameObject。您可以使用 OnRenderImage 创建全屏后处理效果。这些效果通过从源图像读取像素,使用 Unity 着色器修改像素的外观,然后将结果渲染到目标图像中来实现。通常使用图形。Blit 执行这些步骤。
Graphics.Blit
官方文档:使用着色器将源纹理复制到目标渲染纹理。Blit 将 dest 设置为渲染目标,在材质上设置 source_MainTex 属性,并绘制全屏四边形。
若要 blit 到内置渲染管道中的屏幕后缓冲区,必须确保 dest 为空,并且摄影机为空。Camera 的 targetTexture 属性。main 也为空。如果 dest 为空,Unity
将尝试使用Camera.main.targetTexture
作为目标。
2.2 编写 Shader
当输出的 RGB 值相同的时候,就变成了灰度图。所以只要在渲染输出颜色值的地方,将 RGB 输出为相同的值就可以实现了。
实现相同值的我们一般使用是加权平均值的做法,目前最常用的一组灰色 RGB 值是(0.299,0.587,0.114)。
具体怎么来的我也算不明白,感兴趣的同学可以搜索:在使彩色图变灰 RGB 的权重会固定为(R:0.299 G:0.587 B:0.114)? 学习一下。
最终 Shader 如下:
最后创建一个材质球使用上面创建的这个Shader
,待下面使用:
2.3 编写代码
创建代码SetGrayScene
,并将其挂载到摄像机上,通过 2.1 中介绍的OnRenderImage
和Graphics.Blit
实现,具体代码如下:
最后将 2.2 中创建的材质球,赋值给挂到摄像机的脚本上:
2.4 实现效果
运行游戏,调整 grayScaleAmount 值即可看到效果。
实现效果:
将grayScaleAmount
值调整到 1
效果展示
使用 Post Processing 的效果:
使用 Shade 的效果:
版权声明: 本文为 InfoQ 作者【陈言必行】的原创文章。
原文链接:【http://xie.infoq.cn/article/2a5de17277d887149ddb1a1a7】。未经作者许可,禁止转载。
评论