不可否认,电子游戏中的图像技术在过去的10年中发生了翻天覆地的变化。每一个包含前沿技术的新游戏的面世,带给我们的都是无与伦比的实时超现实体验。同样,在unity中着色器及其相关技术也是日新月异,这种不断的更新换代很多时候也是大家产生迷惑的根源之一。在unity 5之前,主要有两种着色器被采用:漫反射和高光着色器。顾名思义,这两种着色器分别用在无光和高光材料上。如果你已经用了unity 5,可以跳过这一部分,这部分内容主要解释如何使用unity 5重现这些之前的特效。
开始这一部分之前,我们需要准备一个unity 4的环境。在unity 4中同样有一些预先提供好的内建着色器。如果你是开始开发一个新游戏,毫无疑问你会使用最新版本的unity,但是如果是个遗留项目,很有可能之前使用的就是一些低版本的unity。在做版本迁移的时候一定要格外小心。在unity引擎中,很多东西都发生了变化。而且就算是某些内建着色器能正常工作,脚本也可能变了。如果你准备迁移整个工作空间,首要的是要做好备份。很重要的一点是:要记住仅仅保存资源和场景文件是远远不够的,unity中大量的配置文件保存在其元数据中。做迁移备份时最安全的方式是将包含项目的整个文件夹拷贝一份。最好的方式是从资源管理器(windows)或者finder(mac)中将整个文件夹物理拷贝一份。
如果你想将之前做好的着色器迁移到unity 5,有两种方式:自动升级项目或统一切换到标准着色器。
自动升级
这是最简单的一种办法。unity可以导入之前版本的项目并对其进行升级。你会发现,升级转换完之后,就不能用unity 4了,哪怕你的资源文件一个都没有改动。原因是unity的元数据已经做过转换了。自动升级的步骤是打开unity 5,单击open other来选择老版本项目所在的文件夹。unity会询问你是否需要进行转换。单击upgrade按钮开始转换。unity会重新导入你的所有资源文件,重新编译脚本。如果你的项目很大的话,这个过程可能持续数小时。转换完成之后,你就会发现一些改变。例如材质的inspector栏中可能会从bumped diffuse变成了legacy shader/bumped diffuse。
即使unity 4中的诸如漫反射、镜面反射等着色器都已经废弃了,untiy 5还是保持了良好的向下兼容性。你可以在材质的下拉菜单中的legacy shaders目录下找到这些遗留着色器。
使用标准着色器
如果不想继续使用遗留的着色器,可以使用unity 5中新的标准着色器来取而代之。在替换之前,需要记住一点:这两者是基于不同的光照模型来构建的,因此肯定会影响材质本身的外观。unity 4中有超过80种不同的内建着色器,总共分为6个大类(普通、透明、透明剪切、自照明和反射类等)。在unity 5中,全都被标准着色器取代。不幸的是,并没有什么魔法可以将你的着色器直接转换成标准着色器,但是你可以通过下面这个表格来理解如何配置unity 5中的标准着色器来模拟unity 4中那些遗留的着色器:
着色器 unity 4 unity 4(遗留) unity 5
漫反射着色器 漫反射朗伯 遗留着色器/漫反射朗伯 标准着色器
基于物理基础的渲染:金属工作流
高光着色器 高光blinn-phong 遗留着色器/高光blinn-phong 标准着色器(高光设置)
基于物理基础的渲染:高光工作流
透明着色器 透明顶点 遗留着色器/透明顶点 标准着色器
渲染模式:透明
渲染模式:剪切
可以使用inspector中的shader下拉菜单来让老的材质使用这些着色器,只需要选择合适的标准着色器即可。如果你的老着色器使用了纹理、颜色和法线映射,这些属性会自动应用在新的标准着色器中。你可能还是需要配置一些标准着色器的参数来让它跟之前的光照模型保持一致。下图展示的是一个斯坦福兔子在旧的漫反射着色器(右图)、转换成标准着色器(左图)和光滑度(smoothness)调为0的标准着色器(中图)中的显示效果:

迁移自定义着色器
如果你在unity 4中写过自定义着色器,大部分情况下在unity 5中可以直接使用这些代码。除此之外,unity 5中对着色器的工作方式做了些微调,因此可能会引起一些错误或者矛盾。最重要的一点修改是光的亮度。unity 5中的光亮度是unity 4 中的两倍。所有老的着色器在重写的时候都考虑到了这一点。如果你升级一些内建着色器,或者切换到标准着色器,不会发现任何问题。但是如果你重写过自己的光照模型,需要注意新环境下光亮度不再需要乘以2倍了。下面这段代码可以确保这一点:
如果你没写过着色器也不用害怕。光照模型相关内容会在第3章中详细解释。
制作着色器始终要考虑性价比。拟实效果好的着色器需要占用大量的计算资源,在某些设备上可能会引起延时。一般而言特效最好应用在一些非常重要、缺之不可的地方。如果某种材质并不需要高光反射,那么就没有必要专门用一个着色器来计算高光效果。这也是unity 4中引入了如此多不同的着色器的原因之一。unity 5中的标准着色器理论上可以替代之前的所有着色器,因为标准着色器集合了法线映射、透明和反射功能。但是在unity 5中进行了某些合理的优化,以确保只计算那些真正必需的特效。如果你的标准材质并没有反射效果,那么unity 5是不会计算这一部分的。
除此之外,标准着色器主要是为拟实材质而设计的。相对而言,老的漫反射和高光着色器并不是为拟实材质而设计的。这也是从老的着色器迁移到标准着色器时,需要对物体的渲染方式做一些修改的原因之一。
第3章深入讲解了漫反射着色器和高光着色器是如何工作的。即使在unity 5 中这些着色器已经废弃了,理解它们的原理对于你设计新的光照模型也是大有裨益的。
第4章将会向你展示如何释放unity 5中的标准着色器的更多潜力。