《Unity着色器和屏幕特效》——2.2 进阶的透明效果

2.2 进阶的透明效果

在第1章里宇航员头盔的半透明材质使用了标准着色器所支持的透明特性。但是这样做有一个问题:由于创建头盔模型时,几何体上的所有三角形都正面朝外,因此使用标准着色器时,只有外表面的正面会产生高光(specularity)效果。但是头盔是半透明的,实际上其内表面也应当接受光照从而产生高光效果。

这个问题可以通过创建自定义着色器解决。我们将在2.1节学习的基础上创建一个结构类似,但能够显示更真实的光照效果的自定义着色器。

2.2.1 创建自定义透明着色器

首先创建一个新的自定义着色器。

1.在项目(Project)面板上单击PACKT_Shaders文件夹,使它的内容显示在资源(Assets)面板上。

2.右键单击资源(Assets)面板上的任一空白位置,在弹出的菜单上单击创建(Create) | 着色器(Shader)| 标准表面着色器(Standard Surface Shader)命令。

3.将新产生的着色器重命名为“Glass”。

再次提醒:在这里为着色器设定的名称不同于材质的着色器选单中的名称,后者在着色器代码中指定。

接着将新建的着色器应用于宇航员头盔的材质,以便当我们继续修改着色器时,能够随时观察到头盔外观的变化。

1.在项目(Project)面板上找到并单击PACKT_Materials文件夹,使文件夹内容显示在资源(Assets)面板上。

2.找到并单击“Helmet”材质。

第1章曾为宇航员的头盔创建并设置过这个材质,因此对该材质的任何修改都会直接反映在场景中。这其中也包括该材质所使用的着色器。

3.在检阅(Inspector)面板上,单击着色器(Shader)下拉选单,并选择Custom/Glass。

在场景中,宇航员的头盔应当重新变为不透明,因为自定义着色器的默认效果是不透明的。这个问题将在后续步骤中修正。

2.2.2 编辑透明着色器

当新着色器创建后,默认生成的代码里定义了着色器名称。该名称由资源面板上的名称加上Custom文件夹名组成。Custom即自定义,用于和标准着色器区分。

1.在项目(Project)面板上单击PACKT_Shaders文件夹,并在资源(Assets)面板上找到并双击“Glass”着色器。着色器的代码将在MonoDevelop中打开。

这一次我们将要仔细看一看默认生成的代码,并在其基础上做修改。

2.第一行代码定义了着色器在材质中的名称。将其改为

末尾的花括号用于括起着色器的其他内容。

3.保存修改。

自定义着色器的默认代码已经具有光照效果,但不支持透明。接下来修改代码以实现透明。

4.在SubShader下面,找到Tags一行,并将Opaque关键字改为Transparent。

在SubShader里面的着色器编译指令代码中,可以指定使用Alpha通道或者其他属性来定义透明度。

在SubShader关键字下面不远处是品红色的Cg代码开始标识。

5.找到着色器的编译指令代码:

6.在上面代码的最后面添加关键字alpha,并用一个空格与前面的关键字分隔。

alpha关键字使得着色器支持透明。

7.再次保存修改,并返回Unity界面。

在场景中可以看到宇航员头盔现在已经变为透明。

透明度由着色器的颜色属性的alpha通道决定。

8.在PACKT_Materials文件夹里找到Helmet材质,在检阅(Inspector)面板上单击颜色(Color)右侧的矩形,弹出颜色选择器窗口。

9.在颜色选择器窗口中将A通道的值改为128,然后关闭颜色选择器窗口。

10.在检阅(Inspector)面板上将平滑度(Smoothness)值改为0.9以使头盔表面具有高光效果。

11.将金属光泽(Metallic)值改为0.188以使头盔表面更加闪亮。

现在如果拉近镜头仔细观察头盔表面,会发现只有外表面有高光效果。我们将继续修改着色器代码以使内表面可见。

创建头盔的内表面

出于对运行效率的考虑,Unity默认忽略物体的背面,只渲染正面。

可以通过修改一行代码来改变这个默认行为,令Unity对物体的正面和背面都进行渲染。

1.回到MonoDevelop窗口。找到Glass着色器的SubShader代码块。

2.在LOD一行的后面添加下面代码。

3.保存修改并且返回Unity窗口。

现在宇航员头盔的正面和背面都会被渲染出来。但是由于正面和背面属于同一个头盔模型,所以它们会在同一道渲染过程中被绘制,这有时也会造成一些错误的渲染效果。

可以通过用两块Cg代码分两次渲染头盔的正面和背面来提高画面质量。这就是本章开始时提到的多遍渲染。

正面和背面分开渲染

为了增强真实感,可以在着色器里将头盔渲染两遍,一遍渲染背面,另一遍渲染正面。并且在其中一遍渲染时,略微放大模型,以便模拟表面的厚度感,产生内、外表面的区分。

1.回到MonoDevelop窗口。

2.在Properties代码块内的_Metallic行后面添加如下一行代码。

上面代码为着色器增加一个厚度(_Thickness)属性,用来控制在其中一遍渲染中,模型被放大或缩小的程度。

3.找到Cull Off一行,将其改为

4.向下找到品红色的Cg代码块结束标识ENDCG一行。

5.在该行下面添加如下代码:

这是一个用于渲染背面的附加着色过程,即前面所说的第二遍渲染。

Cull Front(剔除正面)语句指定这一遍渲染只处理背面,以避免与前一遍只处理正面的渲染过程冲突。当然也可以将这两遍渲染过程混合在一起。本书的后面章节将介绍这种更复杂的着色器。

前面曾介绍过以#pragma关键字开头的着色器编译指令行。这一行可以指定着色器的很多特性。附加着色器过程使用了与原着色器相似的编译指令,但是增加了一个新指令:vertex:vert,这使得我们可以向着色器插入自定义的顶点处理代码。

在顶点处理代码中,以_Thickness属性的值作为移动距离,将模型的每一个顶点沿着表面的法线方向移动,从而便可实现模型的缩放。

经过两遍渲染,玻璃表面便可获得一定厚度感的。其厚度可以由检阅(Inspector)面板上的Thickness属性设置。

6.保存着色器代码的修改并返回Unity界面。

7.在项目(Project)面板上点击PACKT_Materials文件夹,并在资源(Assets)面板上找到并点击“Helmet”材质。

8.在检阅(Inspector)面板上将厚度(Thickness)值设置为-0.2。

这一技巧只适合于模拟轻薄的小块玻璃物体,如头盔、护目镜和眼镜,但它难以模拟需要折射效果的厚玻璃物体,或是其他密度较大的透明物体(例如水池)。

在2.3节中,我们将使用类似的方法来模拟星球的大气层。

时间: 2024-09-17 16:17:15

《Unity着色器和屏幕特效》——2.2 进阶的透明效果的相关文章

《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中的标准变量类型和操作符也得考虑这些优化.理解这些原理不仅有助于正确使用着色器,而且