MMD联动Unity学习日志 Vol.7 Shader Graph基础

前言
上一期的内容是天空盒,它的材质球是由天空盒Shader(着色器)通过GPU绘制而成的。这期我们共同学习Shader的基础和它的基本应用。

Shader和Material的基本概念认知
Up在百度上引用一段,阐述Shader和Material(材质)的基本关系:
“Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。
所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。“
Unity支持Shader的自定义编程,它使用的是标准的cg语言。不过,我们的原则是不写代码。这时就要用到另一种方法来编辑Shader,那就是Shader Graph。

ShaderGraph介绍
Shader Graph着色器视图,可以让你轻松创建各种着色器效果:流动的岩浆,美丽的湖泊,闪动的LED灯,以及你能想象到的更多的效果!
Shader Graph原生支持 Scriptable Render Pipeline (简称:SRP),拥有以下功能:
· 高清晰渲染管线 HD Render Pipeline
· 轻量级渲染管线 Lightweight Render Pipeline
· 通过扩展将任何你自己编写的自定义SRP着色器进行导出。

什么是ShaderGraph着色器视图 ?
你可以通过可视化的方式来创建Shader Graph以生成所需的着色器,无需再手动编写着色器代码,只需通过连接各种节点创建节点网络即可。以下是一些你可以做的事情:
· 通过程序化的方式改变物体表面形状
· 对UV进行变形和动画
· 使用常用的图形编辑操作对对象进行修改操作
· 根据物体所在的世界坐标,法线以及和摄像机之间的距离等信息来改变物体表面
· 将你认为重要的属性,暴露在材质编辑面板上方便编辑操作
· 通过生成subgraph(子视图)在不同Shader Graph之间分享节点网络
· 使用C#和HLSL创建自定义的Shader Graph
· 视图框架可以提供即时的Shader Graph修改反馈,这样即使是新用户也能创建自己的着色器了。

怎么安装ShaderGraph?
安装好的Unity2018是没有ShaderGraph的工具的,如果需要使用这个工具,需要单独安装插件。
打开Window > Package Manager,在All中选择ShaderGraph进行安装。

2018.1.x~2018.2.x版本
点击All面板,找到SRP Core、Shader Graph点击右上角Install安装

2018.3.x~2019.1b
刚打开Packages的列表中没有ShaderGraph选项,此时点击Advanced,出现ShaderGraph等安装选项。


找不到Shader Graph
打开项目的文件夹,在项目目录中,找到Packages目录中的manifest.json文件,打开
修改mainfest.json。

用写字板或其它文本编辑器打开mainfest.json,将"com.unity.shadergraph": "4.1.0-preview",插入文本段落中。

返回Unity工程会发现Unity正在加载工具,加载完之后ShaderGraph插件就已经安装好了。

使用PackageManager
在Unity中,通过点击Window->PackageManager来打开PackageManager窗口。在窗口中选择ShaderGraph 并且在右上角选择加载。

如何看是否加载成功

在项目栏中,点击右键Create出现有PBR Graph,Sub Graph和Unlit Graph那么就已经安装好了。(ShaderGraph旧版的使用方法与现在有所差异,在右键Create后找到ShaderGraph也能证明ShaderGraph安装完成)

如何创建Shader Graph?
在Unity中,Shader Graph看起来就是一个普通的着色器。你可以通过Create >Shader>选择PBR Graph(基于物理渲染),Sub Graph和Unlit Graph其中的一个。这会在Project窗口中生成一个Shader Graph资源。双击这个资源或者点击Open按钮来打开Shader Graph编辑界面。

打开Shader Graph的时候,看到的是一个Master Node。可以通过把其他节点连接到Master Node来创造你先要的效果。
点击齿轮图标可以展开着色器的其它基本属性:
Workflow(工作流)可以选择Specular(高光)和Metallic(金属)。
Surface(表面)可以选择Opaque(不透明)和Transparent(透明)。
Blend(混合)可以选择 Alpha(阿尔法),Premultiply(预乘),Additive(附加),Multiply(乘法)。
Two Sided(两边)勾选框。
右下角是着色器最终显示效果。

每一个内置的Shader Graph节点都有几个输入,为这些输入添加了默认的值,也可以随意改变它们。

通过Shader Graph生成的着色器和Unity中的其他着色器没有任何区别。可以右键点击着色器生成一个新的材质,并将其应用到项目中任意对象上。可以用同一个着色器生成多个材质。

可以在材质上暴露着色器中的参数,这样就可以通过这些参数,调整基于同一个着色器的不同材质的各种属性。只要简单的操作就可以暴露着色器的参数,在Shader Graph中点击任何变量节点,然后选择Convert to Property,这些属性就会显示在所有使用了此着色器的材质的检视窗口中。

暴露的参数有Vector1,Vector2,Vector3,Vector4,Color(颜色),Texture2D(2D纹理),Texture2D Array(2D纹理数组),Texture3D,Cubemap(方形贴图),Boolean(布尔值)。
要查看对Shader Graph所做修改的产生的效果,点击窗口左上角的Save Asset按钮保存修改即可。

创建渲染管线
ShaderGraph是基于可编程渲染管线,我们要使用ShaderGraph也就需要设置SRP。 (注意:如果之前不导入渲染管线,ShaderGraph的材质球不会正常显示,呈现为洋红色,主节点会出现叹号,并提示当前渲染管线与主节点不匹配。如下图)

打开Window >package manager,在All中选择Lightweight RP进行安装。(如果没有找到渲染管线插件,可以尝试用之前的方法导入。在项目目录里找到Packages目录中的manifest.json文件,将"com.unity.render-pipelines.lightweight": "4.1.0-preview",插入中间段落中。)
在SRP中,unity帮我们封装了几种渲染管线:
- 我们可以创建LWRP(轻量级渲染管线),这种渲染管线适合移动设备。
- HDRP(高清晰渲染管线),适用于PC等性能较高的设备
- Custom(自定义渲染管线)
这里我们暂时不做过多研究。

导入渲染管线插件后,unity就可以使用LWRP。
创建Renderpipeline可通过在文件窗口中Create > Rendering >Lightweight Pipeline Asset创建。 创建之后就可以进行渲染管线的设置了。

设置SRP

设置方法:Edit > Project Setting > Graphics。

如果没有设置的话,所有的Shadergraph都是不能使用的。
