如何把Unity 4的旧着色器迁移至Unity 5

不可否认,在过去10年中图形学在电子游戏中获得了惊人的发展。每一个新游戏带来的尖端技术让我们的游戏画面更加接近现实。随着Unity引擎版本的不断迭代,它的着色器技术也自然而然的经历了相当大的变化。这也是为什第一次接触着色器的时候感到困惑的原因。在Unity5还没有推出之前,Unity自带了两种不同的着色器,分别是:漫反射(Diffuse)高光反射(Specular)。正如其名字所描述,它们分别用来模拟表面粗糙和表面光滑的材料。如果你现在使用的Unity5,那么你其实可以跳过这个知识点。该知识点会讲解如何在Unity5中重现这些效果。


  • 始前准备

    要开始这个知识点,前提时你有个用Unity4版本作为开发引擎工作空间,并且你使用了这个版本内建的一些着色器。当你开发新游戏的时候,毫无疑问你应该改选择最新版本的Unity引擎。然而如果你的项目已经使用了旧版的Unity引擎开发,那么你在迁移着色器前应该三思。引擎背后可能又很多东西都不一样了,即使有时候内建的着色器表面看起来可以正常工作,但是你写的脚本可未必能。所以如果你要迁移整个项目空间,这个时候首先要做的事情就是备份。但是要注意噢,仅仅只是保存Assets资源和场景可不够,同时所有的.meta文件也要一并保存,因为大多数Unity的配置信息保存在元数据中。在迁移项目的过程中最稳妥的办法还是要把整个项目空间所在文件夹都复制一份。最好的是物理拷贝一份,如果是windows就在资源管理器物理复制,如果是Mac就在Finder中物理复制。【建议大家将这个项目目录用压缩工具【如winrar】打包一份】。


  • 操作步骤

    如果你想要迁移你的内建着色器,有两个主要选择:采用自动升级的方式或者切换至标准着色器

    • 着色器版本的自动升级

      这种选择是最操作起来最简单的。Unity5可以导入使用旧版内建着色器的项目并且自动升级。你需要主义的是一旦升级完成后,那么你在Unity4中就不能再使用它们了。尽管这个过程并没有直接改变你的Assets资源,但是Unity的元数据已经被转换过了。要进行这个过程,你需要打开Unity5引擎,然后点击文件(File)|打开项目(Open Project)来打开你就项目所在的文件夹。然后回有提示问你是否愿意转换;然后点击升级(Upgrade)执行改过程。Unity就会重新导入所有的Assets资源并且重新编译所有的游戏脚本。如果你的项目非常巨大,这个过程可能回持续几个小时。一旦转换完成,来自Unity4的内建的旧着色器会被相应的替换掉。 你可以通过检查器面板验证这个转换,材质实例中从原来的Bumped Diffuse变为了Legacy Shader/Bumped Diffuse

      注意

      尽管Unity4版本的漫反射,高光反射和其他内建的着色器现在已经已弃用了,但是Unity5依然向后对它们保持兼容。它们在材质的Legacy Shaders路径下的下拉列表中依然可以看到。

    • 使用标准着色器

      相比于使用旧版本的着色器,你可能想使用Unity5新的内建标准着色器替代它们。但是这么做之前,请留意新旧两个版本的着色器是基于不同的光照模型的,你的材质很可能看起来不一样。Unity4总共有8个不同的内建着色器,它被划分进了6个大类(法线(Normal)透明(Transparent)透明剪切(Transparent Cutout)自发光(Self-Illuminated)反射(Reflective))。但在Unity5中,它们都被上一个知识点所讲的那些标准着色器所替代了。不幸的是,没有什么很好的办法能够将旧着色器完美的迁移只新版本的着色器。但是你可以通过下面这个表格着重理解如何通过配置标准着色器去模拟unity4的旧着色器的效果:

      你可以在旧材质的**检查器面板(Inspector)上通过着色器(Shader)下拉菜单改变它所使用的着色器。所有你需要做的就是简单的选择适当的标准材质。如果你的旧着色器使用了纹理,颜色和发现题图,那么在新版本的标准着色器上也会自动使用。当然为了更好的接近之前旧版本着色器的光照模型,你可能需要配置标准着色器的相关参数。 下图展示的是常见的斯坦福兔(Stanford bunny ),它们分别使用旧版本的漫反射着色器(右),被转换的标准着色器(左),和把平滑度(Smoothness)**设置成0的标准着色器(中):

    • 迁移用户自定义的着色器

      如果你以前在Unity4上有写自定义的着色器,很有可能在Unity5中能直接正常使用。即使如此,Unity也有可能在着色器的工作原理上做了细小的改动,这些改动是可能引发一些错误和不一致性。有个变化最明显的重要参数就是光的强度。 光在Unity5中是原来亮度的两倍。所有的旧版本着色器在重写的的时候都应该考虑到这一点;如果你升级了你的着色器或者切换到标准着色器,你不会发现有任何的不同。但是如果你是自己写的光照模型,那么你就要注意确认光的强度不能再乘以二了。我们就用下面的代码举例来确认这种变化:

      // Unity 4
      c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten * 2);
      // Unity 5
      c.rgb = s.Albedo * _LightColor0.rgb * (diff * atten);
      

      如果你还没有写过着色器,大可不必惊慌:光照模型会在第三章,理解光照模型 中全面详细的讲解。

      注意

      Unity5对着色器的处理相比于Unity4来说还有一些其他的变化,你可以下面这个网址中查看所有着色器在Unity5中的处理方式的变化

      http://docs.unity3d.com/Manual/UpgradeGuide5-Shaders.html


  • 原理介绍

    着色器的编写需要权衡画面表现和效率;效果逼真的着色器需要极大的计算量,可能导致严重的延迟。所以,有一点很重要,就是只使用我们确切需要的效果:如果一个材质不需要高光反射,那么就不要在着色器中去计算它们。这也是在Unity4中把这些效果拆分成了很多不同着色器的主要原因。 新版本的标准着色器有潜力替换掉先前旧版本的着色器,因为它把法线贴图,透明度和反射都包括在内了。然而,这个标准着色器经过巧妙的优化,使它能够只去计算用到的效果,没用到的效果就不计算。尽管这样,标准着色器主要还是设计用于模拟现实的材质。相比较而言,漫反射和高光反射着色器并不是为模拟现实的材质设计的。 这就是为什么从旧版本的着色器切换到标准着色器时,游戏对象在渲染的时候通常回发生一些细小的变化的原因。


  • 相关补充

    第三章, 理解光照模型, 将会深入探索漫反射和高光反射着色器的作用原理。尽管在Unity5中,它们已经被弃用了,但是如果你想要设计新的光照那么理解它们还是有必要的。

    第四章,Unity 5中基于物理原理的渲染 ,将会介绍如何在Unity5中展现标准着色器的潜力。