前言
在开始的时候说到过,我们是对 Unity 的默认管线进行 Shader 的编写,并通过提取 Unity 默认的 UI Shader 编写了 UIDefault.cginc,这样就可以在原有的 UI默认Shader 基础上进行修改。
屏幕后效的效果也特别简单,大部分情况下可以理解为上是将屏幕最后得到的渲染图当作一个 2D 的图片进行处理,所以对于 UI 的各种方法也都适用,也可以建立一个 PostEffcet.cginc 以及 其对应的 默认Shader模版。而对于 2D Sprite Shader 来说就比较复杂了,可以看到其背后的 .cginc 有很多东西,我们可以对其进行分析,然后总结出一套适合自己的 Unity默认管线 的 Shader 流程。
这里我们先添加屏幕后效的实现方法,这样之前写的 UI 效果也都适用。
参考文献:
- 《UnityShader 入门精要》
- 入门精要项目地址
屏幕后效
屏幕后效是针对相机来操作的,屏幕显示的最后是根据相机渲染的图片。而屏幕后效就是我们就是在处理完所有物体渲染后(UI可以不处理),对得到的本该直接渲染到屏幕上的一张 2D图片 进行操作而已。
PostEffectsBase脚本
需要挂在相机一个处理脚本,用来处理传入的 Shader ,使用 Shader 生成材质,并做一些判断,实际上我们也可以直接传入材质,这样在材质上就可以做参数输入了。
主要的 API 有两个:
void OnRenderImage(RenderTexture src, RenderTexture dest)
当相机渲染完毕后会自动调用
public static void Blit(Texture source, RenderTexture dest, Material mat);
在 Graphics 类中,相当于使用 mat材质 处理 source 并传给 dest,配合 OnRenderImage 方法使用,可以使用 mat材质 渲染屏幕。
PosetEffectsBase.cs 改自 入门精要
1 | namespace Render.PostEffect |
具体实现
可以看到其实并没有实现 OnRenderImage 也没有调用 Blit,这是因为对应的材质不同需要输入的一些参数也不同,我们通过继承这个 Base 脚本根据不同的效果传入不同的参数。
例如: PencilPE.cs 配合 PencilPE.shader 实现铅笔画风格
PencilPE.cs
1 | using System.Collections; |
PencilPE.shader 其中的主要方法和 UI 的相同
1 | Shader "PostEffect/Sharp" |
可以看到 PencilPE.cs 只是实现了参数的改变并调用了核心方法,如果我们不想多写脚本可以试着,直接在 Base 类中 把 mat 作为面板上的参数,直接传入。
而具体 PencilPE.shader 以及调用的 .cginc 我们放到下篇来讲。