Unity surfaceShader中的finalColor
Unity Surface Shader背后隐藏着较为神秘的机制。之所以说它神秘,是因为很多人对其了解不足,一旦深入了解,这种神秘感便会消失。Unity Surface Shader在Unity 3.0时向公众开放使用,但开发者似乎只能从官网文档中获得一知半解的信息,并且在实际项目中,它的应用也不算广泛。
实际上,Surface Shader封装了CG语言,隐藏了许多光照处理的细节,例如Lambert、Blinn - Phong等光照模型。它的优势在于,能让初学者快速实现很多常见的Shader效果,如漫反射、高光反射、法线贴图等,这些效果通常表现良好。然而,其缺点也很明显,由于隐藏了大量细节,如果想要自定义一些复杂或特殊的效果,使用Surface Shader可能无法实现,或者实现过程会非常繁琐。
基于学习Surface Shader的经验,这里有两条建议:
- 如果你从未学习过Shader编写,且只想实现一些常见的简单Shader,那么仅学习Surface Shader是个不错的选择。
- 如果你追求高品质的游戏画面,Surface Shader远远无法满足需求,并且在某些方面可能会让你更加困惑。
关于Surface Shader的神秘机制,后续再深入探讨。今天,我们先简单介绍一下Surface Shader中最后一步的处理——finalColor。
先来看下面这张来源于网络的图片:
该图片展示了Surface Shader背后的执行过程。目前,我们暂不考虑前面几个阶段,重点关注最后用红色圆圈标记的finalColor这一步。这一步与我们平时设置的tintColor不同,它是在处理完所有光照、光照贴图(lightmaps)、光照探针(light probes)以及其他额外的光源之后,将得到的颜色再次进行处理,从而得到最终的颜色。
下面通过两个例子来进一步说明:
实验一:简单改变Shader最后处理的颜色
在这个实验中,mycolor 是 finalColor 指定的函数名,我们可以通过调节 ColorTint 来改变最后输出的颜色。
我使用 StandarAssets 目录下的一个模型进行实验,正常情况下模型显示如下:
[此处可插入正常情况的模型图片]
改变颜色后,模型显示如下: [此处可插入改变颜色后的模型图片]
实验二:通过finalColor实现雾效
同样,mycolor 是 finalColor 指定的函数名。在这个实验中,我们通过计算顶点距离屏幕的距离来计算雾的浓度。
finalColor 是Surface Shader执行的最后一步,其作用是改变Shader最终生成的颜色,实现起来其实并不复杂。