[toc]适用于Unity2019.4-URP的ShaderGraph-Unlit。 因为是非常图形化的内容,有什么干货的话,用文章的形式分享其实并不方便。 我在ShaderGraph上踩得坑不多,临时起意看看Unity进入2019.4 LTS阶段ShaderGraph有什么阶段性的变化。 整体上来看是无法满足需求的,那么我具体有什么需求呢,ShaderGraph又能做到什么程度呢。 首先,图形化编辑shader的需求是真正存在的,如果现有工具已经到达能将就的地步,是可以容忍不足的; 就像我,平时都在写ET框架上的逻辑,突然要我处理shader问题,手生,很致命。 1.暴露关键词,实现功能开关式切换,比如开启/关闭法线贴图,开启/关闭边缘光。 自定义卡通shader总是有着复杂的需求,很多额外添加上去的元素,或者多种表现形式。 我注意到2019.4中,ShaderGraph已经可以暴露关键词,但是没有图形化的逻辑分支,这种分支是区别于Node的。 可以用自定义节点的方式处理分支逻辑,但是这样一来就与图形化的意愿违背了。 如果大量的内容都是自定义Shader,而自定义Shader又不能插入图形化的Sub Shader,那还不如手写HLSL代码呢。 2.多Pass, Unity帮我们添加了很多个Pass,比如阴影、深度Pass,我们在视图里面编辑的那个是前向渲染的Pass。 像描边这种需要重新绘制一遍才有的效果,单Pass实现不了。 3.Shader GUI 材质参数毕竟是要暴露给不懂shader的人看的,GUI的必要性很高,提高理解效率。 添加GUI的方法是在URP包目录/Editor/ShaderGraph/SubShaders/UniversalUnlitSubShader.cs的GetSubshader方法后面添加自定义ShaderGUI的引用代码,其实暴露给用户也不会很难,传递一个字符串而已;而我们要想实现这个功能,就得手动更改URP源代码了。 总结: 单Pass已经可以做很多事了,比如卡通水、飘舞的旗帜、卡通2D火焰等,网上有不少的例子。 但是图形化是今后的方向,可以期待下2年后的ShaderGraph。 参考资料: ShaderGraph7.4文档

创建Shader

URP可以选的Shader模板:PBR Graph/Sub Graph/Unlit Graph PBR相当于使用Unity推荐的PBR工作流,是一个系统的、高真实度的工作流程; Sub是节点片段,可以封装高频代码; Unlit是自定义光照shader,一切皆靠手写;

界面元素

Preview window:预览窗口,可自定义预览用mesh; Blackboard:规划属性列表、关键词列表、shader路径名; name:shader路径名后缀 path:shader路径名前缀 properties:可用属性,表示颜色、向量、矩阵等; Reference:C#脚本用属性名,用于赋值; keywords: Workspace:工作区域 Master node:定义shader的输出; node:节点,右键访问可选节点,或者拖动属性创建节点; connect:节点之间的连线,左边作为参数输入给右边;

全局设置

Precision:默认精度 Color Mode:颜色模式

Shader路径名

相当于前缀+文件名,前缀我们可以自定义,文件名是捆绑的; 比如:前缀Sekia/Toon + 文件名Character = Sekia/Toon/Character 多层级shader目录容易解决,可以建立Toon目录保存这个分组的shader。 注:Sub Graph的路径名对应新建Node菜单中的选项名。

Sub Graph

Sub Graph用于封装高频代码,如果你只有一个shader,显然并不需要它; 在多个Shader之间共享一部分代码时,可以考虑使用Sub Graph; Output Node:输出节点 Vertex/Fragment阶段限制:如果Sub Graph中包含了锁定阶段的节点,会被锁定阶段; 关键字:Sub Graph中的关键字,要复制到Graph中;

Color Modes

观察图片的颜色变化,是很直观的调试方式,但是同为多通道2维数组的图片却有不同表示方式; UV:单通道,0-1范围,单个点表示UV位置,看起来就像绿+黑+黄+红混合起来; 纹理:4个通道,0-1范围,单个点表示颜色值,色彩丰富的任意图片; 自定义:这个可能性就很丰富了,存储任意浮点数; 精度:观察贴图采样输出的精度类型。

自定义节点

创建新节点时,输入custom,可选创建自定义节点。 需要自定义输入和输出,方法部分可使用Shader语法(参考URP的shader库); 注:可使用$precision代替half和flaot; 自定义节点可转换为Sub Graph。

Keywords

关键词作为开关,生成多种shader变体,供不同场景下使用。 关键词需要被定义,在shader代码中引用,在C#代码中设置要使用的关键词。 Reference Name: Definition:定义方式 Shader Feature:未使用的变体在发布时被剔除; Multi Compile:通常选项,定义的变体不会被剔除; Predefined:管线已定义的全局关键词,这里定义是为了引用; Scope:域影响关键词设置方式,全局关键词可以影响多个shader Local Keywords:常规操作,C#调用时,在Material类型设置; Global Keywords:有全局关键字数量上限;C#调用时,在Shader类型设置; Entries:enum类型关键词名称设置; 注:最后一项使用被作为else状态,理解为效果的off模式。 关键词名称:用于在shader、C#中调用 bool类型关键词:{Reference} enum类型关键词:{Reference}_{ReferenceSuffix}