Unity Surface Shader的背后隐藏着比较神秘的机制,之所以说神秘,是因为不了解,了解了就不神秘,Unity Surface Shader在Unity 3.0的时候被开放给公众使用,但是貌似只能从官网的doc里面去了解一知半解,似乎在我们的项目里面没有怎么用到它。虽然它比较神秘,但是我们可以通过Unity来查看生成的CG代码,实际上Surface Shader是封装了CG语言,隐藏了很多光照处理的细节,例如Lambert、Blinn-Phong等。

Surface Shader可以让初学者快速实现很多常见的shader,例如漫反射、高光反射、法线贴图等,这些常见的效果也都不错。而对应面就是,由于隐藏了很多细节,如果想要自定义一些比较复杂或特殊的效果,使用Surface Shader就无法达到了(或者非常麻烦)。在学了一段时间的Surface Shader后,我认为:

  • 如果你从来没有学习过怎样编写shader,而又想写一些常见的、比较简单的shader,那仅学习Surface Shader是一个不错的选择。

  • 如果你向往那些高品质的游戏画面,那么Surface Shader是远远无法满足你的,而且某种方面来说它会让你变得越来越困惑。

    对于Surface Shader的神秘机制,我们以后再聊,今天先简单的说一下Surface Shader里面最后一步的处理finalColor。

先来看一下下面的图片,来源于网络

该图片展示了Surface Shader背后执行的过程,前面几个阶段暂时不去考虑,咱们以后再说,只看最后划红色圆圈的finalColor这一步,这和我们平时设置的tintColor不一样,这一步是在处理完毕所有的光照,lightmaps, light probes 和其他额外的source之后得到的颜色再次进入finalColor做处理,得到最终的颜色。

泰课在线

 

下面来看两个例子:

实验一. 简单的改变shader最后处理的颜色


泰课在线
mycolor就是finalColor指定的函数名字,最后通过调节ColorTint来改变最后输出的颜色。

我拿StandarAssets下面的一个模型做实验,正常的情况是这样:

泰课在线
改变颜色后是这样:

泰课在线

实验二. 通过finalColor做fog
mycolor就是finalColor指定的函数名字,通过计算顶点距离屏幕的距离来计算fog浓度。

泰课在线
finalColor就是surfaceShader执行的最后一步,用来改变最后shader生成的颜色,其实很简单!