且构网

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

《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

更新时间:2021-10-03 22:01:30

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

3.4 创建BlinnPhong高光类型

Blinn是另一种计算和估算镜面高光更有效的方式。它是通过视线方向和光线方向所形成的半角向量来完成的。它是由一位名叫吉姆·博林(Jim Blinn)的人带进CG世界的。他发现使用半角向量而不是我们自己形成的反射向量来进行计算显得更加高效。这样既减少了代码量也减少了运算时间。如果你看过UnityCG.cginc文件中内置的BlinnPhong光照模型,你就会发现,它使用的正是半角矢量,这也正是它被命名为BlinnPhong的原因。它只是一个完整Phong计算的简单版本。

3.4.1 准备工作

1.这一次,我们只使用现存的场景和对象,并不需要创建一个全新的场景。创建一个新的着色器和材质并将它们都命名为BlinnPhong。
2.新建一个着色器之后,双击它,启动MonoDevelop代码编辑窗口,这样我们就可以开始编写着色器了。

3.4.2 如何操作

1.添加我们的自定义属性到Properties块中,这样我们就可以控制高光的显示效果了。
《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

2.然后,我们需要确保在CGPROGRAM块中添加了相应的变量,这样我们才能在subshader内部访问Properties块中的属性变量。
《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

3.现在,创建自定义光照模型,用于处理Diffuse和Specular运算。
《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

4.为了完成我们的着色器,还需要告诉CGPROGRAM块使用我们自定义的光照模型而不是内置的光照模型,修改#pragma语句如下:
《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

3.4.3 实现原理

BlinnPhong高光模型与Phong高光模型几乎是相同的,除了前者因为采用更少的代码且更高效之外,它们的效果几乎是一样的。你会发现如今着色器十有八九都会使用这种方法,因为着色器在使用这种高光模型进行表现时只需要更加简洁的代码和光照运算。
我们简单地通过视线方向和入射光线方向的角平分线向量来基础地模拟反射向量,而不是直接计算我们的反射向量。这种方法已经被证明比上一种方法在物理计算方面具有更高的精确度,但我们觉得还是有必要展示一下它的真实意义。
为了得到半角向量,我们简单地将视线方向和入射光线的方向添加在一起,如下代码片段所示:
《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

然后,我们再简单地对顶点法线和新的半角向量进行点积运算从而得到我们的主高光值。完成这些步骤以后,我们对它进行_SpecPower次方求幂后再乘以高光颜色值变量_SpecularColor。BlinnPhong高光模型的代码更加简洁而且数学运算更加简单,但是依然能够在实时渲染方面给我们非常漂亮的高光表现。