- Scriptable Render Pipeline(SRP)-可编程渲染管线,是相对Unity内置渲染管线而言的新技术。SRP允许编写C#脚本控制rendering过程。你既可以对渲染管线做出修改,也可以整个重新定义你自己的渲染管线。
- SRP和Unity内置shader不兼容。
- 要使用SRP,Unity版本需>2018.1
预定义的SRP
unity内置了2个SRP框架:
-
High Definition Render Pipeline (HDRP)
: 高分辨率渲染管线,适用于PC或主机上的AAA级别游戏,同时支持Forward and Deferred 渲染。HDRP只使用一种模板。 -
Lightweight Render Pipeline (LWRP)
: 轻量级渲染管线,适用于移动端,部分PC及主机端。使用LWRP获得快速、高质量的渲染。LWRP使用Forward渲染。LWRP使用LWRP和LWRP-VR两种模板。LWRP同样使用自己的Shader,与Unity内置shader不兼容。
这两个内置管线都以package包的形式发布,都包含了Shader Graph编辑器和Post Processing后处理器。
在新建项目中使用上述两个SRP框架:
-
新建项目时,可以选择上述模板之一:
建好后的新场景如下:
-
安装SRP
使用新的包管理器安装:
建立SRP Assets
无论何时使用SRP,首先都要建立Asset:
鼠标右键,Project窗口,create>rendering>选择你想要的asset类型,如HDRenderPipelineAsset-
设置
Edit > Project Settings > Player:
Edit > Project Settings > Graphics: 既然是“可编程”渲染管线,那少不了编程,我们试着写一下:
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Experimental.Rendering;
[ExecuteInEditMode]
public class BasicAssetPipe : RenderPipelineAsset
{
public Color clearColor = Color.green;
#if UNITY_EDITOR
[UnityEditor.MenuItem("SRP-Demo/01 - Create Basic Asset Pipeline")]
static void CreateBasicAssetPipeline()
{
var instance = ScriptableObject.CreateInstance<BasicAssetPipe>();
UnityEditor.AssetDatabase.CreateAsset(instance, "Assets/BasicAssetPipe.asset");
}
#endif
protected override IRenderPipeline InternalCreatePipeline()
{
return new BasicPipeInstance(clearColor);
}
}
public class BasicPipeInstance : RenderPipeline
{
private Color m_ClearColor = Color.black;
public BasicPipeInstance(Color clearColor)
{
m_ClearColor = clearColor;
}
public override void Render(ScriptableRenderContext context, Camera[] cameras)
{
// does not so much yet :()
base.Render(context, cameras);
// clear buffers to the configured color
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, m_ClearColor);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
context.Submit();
}
}
保存后,点击菜单中的SRP-Demo/01 - Create Basic Asset Pipeline
,将会在工程目录下生成BasicAssetPipe.asset,将它拖入刚才的Edit > Project Settings > Graphics窗口,设置BasicAssetPipe.asset的clearcolor看看。
2. ShaderGraph
- 在包管理器中安装ShaderGraph
- 注意,SG目前只能在LWRP下使用
- 工程中新建以PBR结尾的Shader,双击即可进入SG编辑
例1:菲涅尔反射
Fresnel节点包含了三个输入,分别是表面法线的方向,表面视角的方向以及一个浮点数。计算公式如下
Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power)
随着法线和视角方向夹角的增大,我们得到的结果也是越来越大的,这样我们容易得到一个渐变的材质。因此对于一个球形的模型,应用了FresnelEffect的效果就是看上去变成了一个渐变的空心圆形。所有边界上的点都趋向于view与normal夹角为90°,中心的夹角趋向0°。在结合一个指数函数,放大渐变的效果。
例2:溶解效果
例3:法线扰动实现Water
例4:水面波纹的实现
例5:UV位移实现切割效果
UV→split→sin+time→alpha
例6:霓虹灯效果实现