且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型

更新时间:2022-10-01 18:59:57

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈》一 书中的第3章,第3.2节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 利用Unity3D内置的高光类型

Unity已经为我们提供了一个高光函数,我们可以在自己的着色器中使用。这个高光函数也就是BlinnPhong镜面反射光照模型。它是高光类型中的一种更加基础且高效的形式,你甚至可以在当今的游戏中找到很多关于它的应用。由于它已经集成到Unity着色器语言当中,首先我们可以在Unity着色器中建立高光效果——我们认为这是一个很好的开端。你也可以在Unity的参考手册中找到相关的例子,但我们将对高光进行更深层次地探究,并且解释高光数据的来源以及它的工作原理。这将帮助你在建立高光模型上打下坚实的基础,也可以帮助我们顺利地掌握本章接下来的这些知识。

3.2.1 准备工作

让我们通过下面的步骤开始本章的学习:
1.创建一个新的着色器并命名。
2.创建一个新的材质并命名,为它赋予新的着色器作为它的材质属性。
3.创建一个球形物体,并将它放置在世界坐标的中心位置。
4.再创建一个方向光,并将光线照射在目标物体上。
当在Unity中设置好资源文件以后,还需要新建一个场景,如下图所示:
《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型

3.2.2 如何操作

1.在着色器的Properties块中添加下面的代码:
《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型

2.然后,我们需要确保在CGPROGRAM块内部添加了相应的变量,这样我们才能在着色器的CGPROGRAM块内部使用属性中的数据。请注意我们并没有声明一个_SpecColor属性作为变量,这是因为在内置的高光模型中Unity已经为我们声明了该变量。我们需要做的只是在Properties块中声明该变量,并将数据传给surf()函数。
《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型

3.现在,我们需要告诉着色器我们想要采用怎样的光照模型来进行光照渲染。你已经学习了Lambert光照模型,也知道了如何使用自己的光照模型,但是我们还没有见过BlinnPhong光照模型。所以,让我们用如下语句将BlinnPhong添加到#pragma语句后面:

《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型

3.2.3 实现原理

当你在构建自己的着色器原型时,基础的高光模型是一个很好的出发点。因为你可以花大量的时间去完成你的核心功能而不需要关心它的基本光照功能。
Unity为我们提供了一种光照模型,该模型帮助我们完成了建立高光光照的任务。如果你查看Unity安装目录Data文件夹下的UnityCG.cginc文件,你会发现你有Lambert和BlinnPhong两种光照模型可以使用。当你使用#pragma surface surf BlinnPhong编译着色器的时候,你就会告诉着色器使用UnityCG.cginc文件中的BlinnPhong光照函数,这样我们就不需要重复地编写这部分代码了。
着色器完成编译后,如果没有错误的话你应该会看到如下图所示的结果:
《Unity着色器和屏幕特效开发秘笈》—— 3.2 利用Unity3D内置的高光类型