知乎上看到的很好的入门文章  知乎连接

零基础入门Unity Shader(三)

零基础入门Unity Shader(三)

 

Technical Art,TA交流群:763506271

前言

都已经讲到第三篇了,还是没有讲到Shader中的代码干货,有些人可能已经等不及了,好了,这篇就来扒一扒Shader中的代码框架。


IDE

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。说白了就是你需要安装一个这样的脚本编缉器来写你的Shader代码。

现在让我们双击上一篇中新建的Unlit Shader,来一睹她的内在美〜

如果双击没有反应,说明你没有为Unity安装配置IDE,大家可以选择Visual Studio或者Visual Stduio Code(简称VSCode),个人比较喜欢用VSCode,免费,简洁美观,有Shader语法提示插件,具体怎么安装配置就不细说了,这个在网上有很多教程。

Visual Studio Code - Code Editing. Redefined​code.visualstudio.com图标


框架

打开后,看到五十几行代码如果感到一脸懵逼的话,没关系,说明你看对文章了,现在呢我们先做一件事情,就是把这五十几行代码删除得只留框架,如下所示:

为了说明框架问题,我私自在最后第12、13行添加了两条语句,大家也可以先抄上去,后面我们会讲解。

从整体来看的话,大致是这样的一个框架结构:

Shader "name" { [Properties] SubShaders [FallBack] [CustomEditor] }

可以拆分成以下几个大部分:

  1. Shader "name"
  2. Properties
  3. SubShaders
  4. FallBack
  5. CustomEditor

其中[]方括号表示的是可选,意思就是说在Shader中可以没有它,只要不需要的话不加也是没有问题的。


花括号{}

整段代码中出现最多就是花括号,这个也是最基本的语法结构,仔细观察你会发现,它们都是成对成对出现的,这是基本法则,一对花括号就代表一个组,用于标记某块功能的开始与结束。它们之间也可以是互相嵌套的,组内可以有多个组。一旦花括号没有成对出现,在Console面板就会即时报错:

或者在此Shader的Inspector面板中提示报错:

在报错信息的最后有个14,代表着我们代码中是哪一行导致的错误,通过双击这条报错信息可以快速定位到相应Shader的具体行数。

注:当在Console点击Clear时,可以清除掉Shader的报错信息,这一点与脚本的报错是不同的,要注意这一点,如果真不小心清除掉了,可以点击Shader,在Inspector面板来查看具体的错误信息。

Shader名称路径

第一行的内容是 Shader "Unlit/NewUnlitShader",如果你的脚本编缉器有语法高亮功能,那么你会看到这一行中的Shader字眼被标注为不同的颜色,表示这是个关键字,后面""双引号中的内容就是具体的路径与名称。

我们尝试将其名称改成:

Shader "TA/MyFirstShader"

在材质球中的路径会变成如下,其中双引号中的/表示的是创建子层级。

同样我们也可以把名称路径改成中文字符(没有在正式项目中使用过,建议大家也不要这样问做,最好还是用英文!):

如果我们把路径名称放在Hidden下面的话,比如:
Shader "Hidden /TA/MyFirstShader"
则表示在材质面板中隐藏此Shader,你将无法通过材质下拉列表中找到它。这在做一些不需暴露的Shader时很有用处,可以使Shader下拉列表更精简整洁。

 

而Shader文件的名称,也就是我们在Project面板中的资源文件的名称,是可以与Shader内部的路径名称不一样的,这点与C#是不同的。
在定义内部路径名称时,建议统一规划下,不要Shader过多后导致很混乱,不便于美术去使用。

Properties

属性,材质球面板中显示的贴图和一些参数什么的都是在此Properties中进行定义设置的,内容必须写在Properties后的{}内。当然,如果你确定不需要属性的话也可以将整个Properties以及它的{}全部删除,因为它是可选项。

我们下一篇会进行Properties的详细说明,包括如何实现滑杆、开关、下拉选择框等。


SubShaders

如果你够细心的话你会发现为什么SubShaders带个S呢,因为它可以有不止一个呀,实际上每个Shader中都可以包含多个SubShader,不可以没有,必须至少有一个,因为当前Shader的核心算法实现就是在SubShader中来实现的。在加载Shader时,Unity将遍历所有SubShader列表,并最终选择用户机器支持的第一个。

这个功能到底有什么用呢?

我们都知道不同的硬件性能是不一样的,游戏内通常把机器配置分为高中低三种,假如我们做了一个效果很好的Shader,但是呢却只能在高配机上有较好的性能表现,中低端就显的太费性能,这时怎么办呢,SubShader在这时就可以派上用场了,我们可以在这个Shader内做三个SubShader,分别对应于高中低不同的配置。


FallBack

备胎,就是备胎的意思,有的时候我们写的Shader难免在一些机器上会出现不支持的问题(最终呈现的就是显示成粉红色),而这个时候我们只要添加了FallBack,并且在后面的双引号内写上了其它Shader的有效路径名称,那么在碰到不支持的硬件时这个Shader就会自动切换成FallBack内的Shader,如果FallBack内的Shader也不支持呢,那就继续从FallBack内的Shader中再找FallBack。。。。


CustomEditor

自定义界面,也就是说我们可以通过这个功能来自由定义材质面板的显示结果,它可以改写Properties中定义的显示方式。

举个你一定见过的例子:

Standard Shader对应的材质面板显示与众不同,很高级,这就是因为它利用了CustomEditor的功能来实现的,要做到这一点,必须要用到C#来写代码实现,这对于刚入门学Shader的同学来说不是易事,同时也由于这个功能在大多数情况下是不需要的,所以我们先抛开它,知道有它的存在就好了。后续如果有机会我们再专门解讲这个。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐