什么是Shader?
着色器 (Shader) 应用于计算机图形学领域,指一组供计算机图形资源在执行渲染任务的时使用的指令,用于计算机图形的颜色或明暗。但近来,它也能用于处理一些特殊的效果,或者视频后处理。通俗的说,着色器告诉电脑如何用特有的一种方法去描绘物体。作为渲染器的一部分,负责计算目标的颜色,主要图形软件库有OpenGL和Direct3D。
Unity的shader,和我们熟悉的C、C++、C#、java等语言不同,C++等语言是属于CPU编程。Shader使用的是HLSL,GLSL或CG语言,这些shader语言属于GPU编程,很多语法结构并不符合我们传统的计算机语言的认知,初学者可能感觉很蹩脚。事实上,哪怕是很多中高级开发者,编写shader也不是很顺手,需要边写,边查阅资料。因此应运而生了shader的可视化编辑器,其实可视化编辑器最早在虚幻引擎unreal中就得到了应用,包括蓝图,材质编辑器,行为树编辑器等。而Unity引擎也出现了对应的shader编辑器: Shader Forge , Amplify Shader Editor 和 Shader Graph 。虽然功能各有优劣,但是节省了我们大量的手写shader的时间,很值得我们去学习。
一、简单介绍
Shader Graph :就是着色器图。在有这项技术之前,开发者只能通过一行行手动敲代码来实现着色器,而且 Shader 的语言与 C# 完全是不一样的,这在无形中提高了在 Unity 中构建着色器的门槛。在有了 Shader Graph 之后,开发者可以跳过代码进行可视化构建,还能通过节点实时调适图片效果,这为美术师和其他团队成员打开了使用着色器的大门。
获取途径:Amplify Shader Editor | 可视化脚本 | Unity Asset Store
Shader Forge :Shader Forge是适用于Unity基于节点的着色器编辑器,可以轻松创建自己的着色器,而不需要写代码!
官方:Shader Forge
官方文档:https://www.neatcorporation.com/Projects/ShaderForge/Media/ShaderForge_QuickStart-sc.pdf
其他介绍:ShaderForge介绍_哔哩哔哩_bilibili
Amplify Shader Editor :Unity 官方所推荐的可视化着色器编辑器,提供了一个对 Unity 开发者相当友善的开发环境,可以与 Unity 编辑器和著色器完美的融合。透过这个工具,开发者能够轻鬆实现 AAA 级质量的作品,并且能够相当灵活地应用在任何 Unity 开发专案中,进而缩短製作团队在美术呈现画面上的开发时间。
二、开发历史
Shader Graph在 Github 上的最早开发日期可以追溯到 2013 年 4 月 30 日,官方论坛的发布日期是 2014 年 1 月 11 日,仅支持 Built-in 管线。第一个正式版为 2018 年 5 月 8 日(版本 1.1.5)。现已开源且基本停止开发。
Amplify Shader Editor在 Asset store 中显示第一个提交版本为 2016 年 9 月 12 日,2022 年 9 月 15 日作者 Diogo Teixeira 在官方 Discord 频道宣布,ASE 已从团队开发转为独立开发,并开始计划 2.0 版本。
三、工作原理及优劣
Amplify Shader Editor
基于单个静态模板生成 .shader 文件,将节点信息以注释的形式存储于文件末尾
优势:
- 官方模板可定制性强,可视化界面几乎可以覆盖 URP 的主要功能
- 模板修改简单直观,可轻松实现诸如多 pass 功能
- 生成明文代码易于调试
- 最终文件不需要依赖插件本体
- 支持管线差异化计算
- 不依赖管线版本
- 官方更新频率高
劣势:
- 修改模板后需要重载节点编辑界面
- 切换模板有可能需要重连节点
- 原版模板生成的 shader 无法跨管线运行
- HDRP 支持度严重不够
- 官方模板对管线特性支持不够标准
模板位置:
AmplifyShaderEditor\Plugins\Editor\Templates
Shader Graph
基于 C#,但生成 .shadergraph 格式的中间文件用于存储节点信息,动态编译成 shader 使用
优势:
- 原生支持跨管线
- 基于 C# 的模板生成可以进行更高级的定制
- 定制管线时需要针对模板的修改可以自动应用到所有 SG shader 中,可维护性非常高
劣势:
- 跨管线时面板参数不统一,不支持管线差异化计算
- 最终文件是黑盒,无法立即切换成代码,调试麻烦
- 官方更新频率非常低,受引擎及管线版本限制且内容不痛不痒
- 2021 以前不支持顶点计算
- 自定义函数不支持 inout,变量名必须带精度后缀
- 仅支持 4 套 UV
- URP 不支持 Tessellation
模板位置:
HDRP
com.unity. render-pipelines.high-definition\Editor\Material\ShaderGraph
URP
com.unity.render-pipelines.universal\Editor\ShaderGraph
Shader Forge
优点:
- 可视化做好了很多shader工具,只要图形化拖入过来就可以了
- 可以快速看到shader效果
缺点:
- 对于初学者而言,shade graph 此类图像化工具并不能降低shader的开发难度
- Shader graph是自动生成shader代码,生成的shader代码可能性能并不好
- 节点过多时可读性变差,项目使用中,多种效果共同部分无法复用
- 由于是美术使用居多,通常易出现冗余指令和低效执行代码
四、总结与选择
- ASE 生成的是明文shader文件,可以自行修改调整部分不合理的生成。 Shader Graph也能看到他生成的shader,但是设计上unity尽量希望黑盒,不想让你看到。
- ASE 可以几条管线互相切,Shader Graph只能urp下使用。
- ASE兼容所有Shader Graph的节点和参数。
Shader Graph属于unity内置的着色器可视化的工具,因此会更加的简便。并且有个说法叫既然官方有自己的shader可视化编辑器,那当然是用官方自己的了可视化编辑器了。
Shader Forge 和 Amplify Shader Editor都是从资源商店就能获取的unity 资源包,且不是免费的。这两者的功能都比Shader Graph多,体现在节点更多,因此可自定义的东西也会更加丰富。但目前Shader Forge已经停止更新包内容了。
如果目前要在两种中选一个的话,更加推荐使用Amplify Shader Editor。Shader Forge 和 ASE这两个都能通过节点连接的方式自定义光照模型,但Shader Graph就没有能自定义光照模型,因为Shader Graph中没有光照相关的节点,并且Shader Graph只有两种一种PBR和无光照两种shader模板。
unity shader可视化工具在实现效果的时候是更加的快捷方便,很容易出效果。但是节点过多也会导致项目的性能变差,因此使用unity shader可视化工具来快速实现效果还是可以的,在实际项目中更加推荐手写shader代码。如果不了解shader底层基础知识,即使有节点式的shader可视化工具也是不会进行shader开发的。这就好比有shader可视化是开车,手写代码是走路,要说速度快肯定是开车;但说哪个起到运动作用还得是走路的方式。
无论选择哪一方,都务必掌握基本的代码能力,连连看只能提高效率,黑盒永远不可信。