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

3.3 创建Phong高光类型

Phong高光模型是最基础且表现最友好的高光类型。它会计算出光在物体表面的反射方向与观察者视线方向之间的对比结果。它是一种非常常见的高光模型,从游戏到电影都有诸多的应用。虽然在镜面反射的精确建模上它并不是最接近现实的,但在大多数情况下它都显得极为逼真。另外,如果你的观察对象是远离相机的而且不需要对高光进行精确计算的时候,Phong高光模型是表现着色器高光效果最好的方式之一。
在本节中,我们将要学习的内容包括如何对Phong高光类型进行逐顶点操作,以及在表面着色器中使用Input结构体的新参数进行逐像素操作。我们还会看一看它们之间的差别,并探讨两种不同实现方式的使用条件以及原因。

3.3.1 准备工作

1.创建一个新的着色器、材质和物体对象,并对它们进行适当命名以方便找到它们。
2.最后,将着色器附加到材质上,然后将该材质赋给新建的物体对象。建好场景后,再创建一个方向光,这样才能看出我们编写的高光效果。

3.3.2 如何操作

1.阅读至此,你可能已经发现了一个模式,我们似乎总是喜欢从基础的部分开始编写着色器。现在,我们将如下所示的属性添加到着色器中:

2.然后我们需要确保位于SubShader块中的CGPROGRAM块中添加了相应的属性
变量。

3.现在,我们需要添加自定义的光照模型,以便计算Phong高光。将下面的代码添加至着色器的SubShader()函数中。现在先不要关心这些内容的意义,因为我们将在下一节中逐行地解释每一句代码:

4.最后,我们还应该告诉CGPROGRAM块,它需要使用我们自定义的光照函数而不是内置的函数。为了做到这些,我们对#pragma语句进行如下修改:

3.3.3 实现原理

我们只将光照函数本身进行分解,因为对于着色器的其余部分你应该相当熟悉了。
我们简单地从使用光照函数为我们提供的一个视点方向开始。希望大家记住,Unity已经为我们提供了一系列可以使用的光照函数,但是为了正确地使用它们,你还必须使用相对应的正确参数。

在这里,我们正在创建的是一个高光着色器,所以我们需要选择的是视点相关型的光照函数结构。因此,我们用如下代码编写该函数:

这样就会告诉着色器我们想要建立的是一个自定义的视点相关型着色器。当然,你还要确保光照函数的命名与#pragma语句的声明相一致,否则Unity无法识别你的光照模型。
接下来,光照函数会首先计算顶点法线和光的入射方向或矢量的点积值来声明一个常用的漫反射组件。我们将得到一个返回值,当该值为1时,表明物体是正对着光源方向的,反之该值为-1时表明物体是背对着光源方向的。
然后我们计算反射向量,先对顶点法线的向量值进行缩放,将该值乘以2.0后再乘以diff值,得到的值减去光照的方向向量值。这样做的原因是为了实现法线朝向光源弯曲的效果,所以作为一个远离光源的法线向量,它将被强制朝向光源方向。为了得到更直观的视觉表现可以参考下图。产生这种效果的调试脚本放在本书的支持页面www.packtpub.com/support上。

接下来,我们需要做的就是创建spec值和颜色值。为了得到这两个值,我们对反射向量和视角方向进行点积运算,然后对结果求_SpecPower次方,最后将_SpecularColor. rgb值乘以spec值得到我们最后的高光。
下图展示的是我们在着色器中进行单一的Phong高光计算的最终结果:

时间: 2024-07-30 14:29:45

《Unity着色器和屏幕特效开发秘笈》—— 3.3 创建Phong高光类型的相关文章

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.7 创建透明材质

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.7节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.7 创建透明材质 到现在为止,我们见到的着色器都有一个共同点-都用在实心材质上.如果你想提升游戏视觉效果,某些时候透明材质是个不错的选择,比如火焰效果或者窗户玻璃等.透明材质的制作相对复杂一点.在渲染实心物体之前,Uni

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.4 给着色器添加纹理

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.4节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.4 给着色器添加纹理 在模拟现实效果方面,纹理可以让着色器迅速生动起来.为了高效使用纹理,我们需要理解二维图像是如何映射成三维模型的.这个映射过程称为纹理映射.为了进行纹理映射,我们需要在着色器和想要应用纹理的三维模型上

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.6 法线映射

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.6节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.6 法线映射 三维模型中的每一个三角形都有一个面朝方向(facing direction),顾名思义指的是三角形的朝向.这个方向通常用一个从三角形中心出发垂直于三角形表面的箭头表示.面朝方向对于光线在物体表面反射的时候起

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.9节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.9 打包和混合纹理 纹理不仅在存储许多像素颜色数据的时候非常有用,同时还可以用来存储x和y方向的一堆像素集合以及其RGBA通道.可以将几个图像打包成一个RGBA纹理,然后通过着色器代码来提取每一个R,G,B,A组件作为单

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.5 通过修改UV值来滑动纹理

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.5节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.5 通过修改UV值来滑动纹理 在物体表面滑动纹理是现代游戏行业中一种非常常用的纹理技术.通过滑动纹理可以创建出诸如瀑布.河流.熔岩等诸多生动的特效.这种技术也是制作精灵特效的基础,关于这部分内容会放在本章另外一小节中.首

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一1.3 从Unity 4向Unity 5迁移

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第1章,第1.3节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 1.3 从Unity 4向Unity 5迁移 不可否认,电子游戏中的图像技术在过去的10年中发生了翻天覆地的变化.每一个包含前沿技术的新游戏的面世,带给我们的都是无与伦比的实时超现实体验.同样,在Unity中着色器及其相关技

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一第2章表面着色器和纹理映射2.1 引言

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.1节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 第2章 表面着色器和纹理映射 在这一章中,会研究表面着色器.我们会从一个非常简单的无光材料开始,最后做出一个全息投影和高级地形混合特效.我们还可以用纹理来制作动画.混合或者其他一些特效.在这一章中,你会学到如下内容:漫反射着

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.10 在地形周围创建圆环

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.10节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.10 在地形周围创建圆环 很多即时战略游戏需要通过在某个选定单位周围绘制圆环来显示一些距离(比如攻击范围.移动距离.视野范围等).如果地形是平整的,可能只需要在四边形上画一个圆形纹理就可以了.但是如果地形不是平的,则四

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.2 漫反射着色

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.2节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.2 漫反射着色 在开始学习纹理映射之前,我们需要先理解漫反射着色是怎么工作的.某些物体的颜色比较均匀,表面很光滑,但是又不是光滑到那种像镜子一样光亮的程度.这种非反光材料最好的渲染方式就是使用漫反射着色器.虽然在真实世界

《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.3 使用包装数组

本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.3节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问"华章计算机"公众号查看 2.3 使用包装数组 简单来讲,着色器中的代码需要在屏幕的每一个像素上执行,这也是为什么GPU现在都需要优化成并行计算的.同样的道理,在Cg中的标准变量类型和操作符也得考虑这些优化.理解这些原理不仅有助于正确使用着色器,而且