在学习这个shader之前先提个常用概念,即光照模型,LightModel(光照模型)即是对于物体怎么对打在其上的光做出视觉反应的数学模型,意即表达物体对光反应产生的视觉效果与入射光、物体表面属性等数值相关联的数学表达。
大致了解了光照模型的概念,接下来介绍下今天的主角,Half Lambert模型,该模型是Valve在开发经典游戏《Half-Life(半衰期)》(半条命这个译名真是后无古人的误翻啊……)是发明的,在以前的游戏中,一旦模型背对着光源,模型表面的亮度会立刻降低,使得整个模型显得平面化,毕竟游戏世界并非像现实中有各种漫散射光能照亮背光的一面,所以half-lambert算法提高了物体在背对光源时的亮度,由于其并非根据真实物理推算出来的结果,而仅仅是一种视觉感受的提升,所以其实现方式并不复杂,很多shader入门书籍都介绍过这种算法,不必担心完全看不懂。
未启用/启用half-lambert算法(右侧为启用)
现在我们来看看怎么实现这个算法,首先因为vs对shader关键字高亮支持并不太好(联网工具包中的shader高亮插件其实还行),所以可以用引擎自带的mono dev或者sublime text来编写Cg文件,这个看大家个人喜好了,有空我会介绍下vs和sublime text对shader关键字高亮的设置。
打开unity3d,在project栏中的Assets下建立Materials Shader两个文件夹(良好的资源管理是开发工程的必要前提),在shader中创建一个surface shader并将之命名为halfLambert。
打开shader文件,可以看到默认的属性栏Properties,这下面的变量不仅要在下面的代码中使用,同时也能在引擎的inspector中进行调整。
现在我们将其修改为如下属性: