Shader模版
- Standard Surface Shader
标准表面着色器,是一种基于物理的着色系统(使用了Physically Based Rendering(简称PBR)技术,即基于物理的渲染技术),以模拟现实真实的方式来模拟材质与灯光之间的关系,可以很轻易的表现出各种金属反光效果,同时此种Shader的书写逻辑也更符合人类的思维模式。
- Unlit Shader
Vertex/Fragment Shader,也就是最基本的顶点片断着色器,不受光照影响的Shader,多用于特效、UI上的效果制作。
- Image Effect Shader
也是顶点片断着色器,只不过是针对后处理而定制的模版,后处理是什么呢?Bloom(也有人叫Glow/泛光/辉光等说法)、调色、景深、模糊等,这些基于最终整个屏幕画面而进行再处理的Shader就是后处理。
- Compute Shader
Compute Shader是运行在图形显卡上的一段程序,独立于常规渲染管线之外的,它可以直接将GPU作为并行处理器加以利用,从而使GPU不仅具有3D渲染能力,还具有其他的运算能力。
- Shader Variant Collection
Shader变体收集器,在上面创建的时候,你会发现Shader Variant Collection与以上四个是被隔开的,就是因为这个与它们不一样,它不是制作Shader的模版,而只是对Shader变体进行打包用的容器。
shader必须依赖于材质使用
shader代码的整体结构
从整体来看的话,大致是这样的一个框架结构:
Shader “name” { [Properties] SubShaders [FallBack] [CustomEditor] }
可以拆分成以下几个大部分:
Shader “name”
Properties
SubShaders
FallBack
CustomEditor
其中**[ ]**方括号表示的是可选,意思就是说在Shader中可以没有它,只要不需要的话不加也是没有问题的。
-
Shader名称路径
第一行的内容是 Shader “Unlit/NewUnlitShader”,如果你的脚本编缉器有语法高亮功能,那么你会看到这一行中的Shader字眼被标注为不同的颜色,表示这是个关键字,后面""双引号中的内容就是具体的路径与名称。
如果我们把路径名称放在Hidden下面的话,比如:
Shader “Hidden/TA/MyFirstShader”
则表示在材质面板中隐藏此Shader,你将无法通过材质下拉列表中找到它。这在做一些不需暴露的Shader时很有用处,可以使Shader下拉列表更精简整洁。而Shader文件的名称,也就是我们在Project面板中的资源文件的名称,是可以与Shader内部的路径名称不一样的,这点与C#是不同的。
在定义内部路径名称时,建议统一规划下,不要Shader过多后导致很混乱,不便于美术去使用。 -
Properties
属性,材质球面板中显示的贴图和一些参数什么的都是在此Properties中进行定义设置的,内容必须写在Properties后的{}内。当然,如果你确定不需要属性的话也可以将整个Properties以及它的{}全部删除,因为它是可选项。
-
SubShaders
由于不同的硬件性能是不一样的,游戏内通常把机器配置分为高中低三种,假如我们做了一个效果很好的Shader,但是呢却只能在高配机上有较好的性能表现,中低端就显的太费性能,这时怎么办呢,SubShader在这时就可以派上用场了,我们可以在这个Shader内做三个SubShader,分别对应于高中低不同的配置。
-
FallBack
备胎,就是备胎的意思,有的时候我们写的Shader难免在一些机器上会出现不支持的问题(最终呈现的就是显示成粉红色),而这个时候我们只要添加了FallBack,并且在后面的双引号内写上了其它Shader的有效路径名称,那么在碰到不支持的硬件时这个Shader就会自动切换成FallBack内的Shader,如果FallBack内的Shader也不支持呢,那就继续从FallBack内的Shader中再找FallBack。。。。
-
CustomEditor
自定义界面,也就是说我们可以通过这个功能来自由定义材质面板的显示结果,它可以改写Properties中定义的显示方式。
举个你一定见过的例子:
Standard Shader对应的材质面板显示与众不同,很高级,这就是因为它利用了CustomEditor的功能来实现的,要做到这一点,必须要用到C#来写代码实现,这对于刚入门学Shader的同学来说不是易事,同时也由于这个功能在大多数情况下是不需要的,所以我们先抛开它,知道有它的存在就好了。