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

简介:

本节书摘来自华章出版社《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块中,这样我们就可以控制高光的显示效果了。
screenshot

2.然后,我们需要确保在CGPROGRAM块中添加了相应的变量,这样我们才能在subshader内部访问Properties块中的属性变量。
screenshot

3.现在,创建自定义光照模型,用于处理Diffuse和Specular运算。
screenshot

4.为了完成我们的着色器,还需要告诉CGPROGRAM块使用我们自定义的光照模型而不是内置的光照模型,修改#pragma语句如下:
screenshot

3.4.3 实现原理

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

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

相关文章
|
4月前
|
算法 安全 图形学
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)
Unity Hololens2开发|(十一)MRTK3 Solver(求解器)
|
4月前
|
API 图形学
Unity Hololens2开发|(十)MRTK3空间操作 ObjectManipulator (对象操控器)
Unity Hololens2开发|(十)MRTK3空间操作 ObjectManipulator (对象操控器)
|
4月前
|
Go 图形学
Unity Hololens2开发|(九)MRTK3空间操作 ConstraintManager(约束)
Unity Hololens2开发|(九)MRTK3空间操作 ConstraintManager(约束)
|
4月前
|
算法 图形学 UED
Unity Hololens2开发|(八)MRTK3空间操作 BoundsControl(边界控制)
Unity Hololens2开发|(八)MRTK3空间操作 BoundsControl(边界控制)
|
4月前
|
图形学
Unity Hololens2开发|(七)MRTK3子系统 TextToSpeechSubsystem(文本转语音)
Unity Hololens2开发|(七)MRTK3子系统 TextToSpeechSubsystem(文本转语音)
|
4月前
|
图形学
Unity Hololens2开发|(六)MRTK3子系统 DictationSubsystem(听写功能)
Unity Hololens2开发|(六)MRTK3子系统 DictationSubsystem(听写功能)
|
4月前
|
图形学
Unity Hololens2开发|(五)MRTK3子系统 KeywordRecognitionSubsystem(关键字识别)
Unity Hololens2开发|(五)MRTK3子系统 KeywordRecognitionSubsystem(关键字识别)
|
5月前
|
开发框架 Java C#
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
【Unity逆向】玩游戏遇到的“飞天锁血”是怎么实现的?
93 0
|
5月前
|
存储 自然语言处理 监控
【Unity 实用工具篇】| 游戏多语言解决方案,官方插件Localization 实现本地化及多种语言切换
Unity的多语言本地化是一个很实用的功能,它可以帮助游戏支持多种语言,让不同语言的玩家都能够更好地体验游戏。 而实现本地化的方案也有很多种,各个方案之间也各有优劣,后面也会对多个方案进行介绍学习。 本文就来介绍一个专门作用于多语言本地化的Unity官方插件:Localization 。 这个插件方便进行游戏的多语言本地化,让游戏支持多种语言,下面就来看看该插件的使用方法吧!
|
4月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
76 2