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

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.4节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问“华章计算机”公众号查看

2.4 给着色器添加纹理

在模拟现实效果方面,纹理可以让着色器迅速生动起来。为了高效使用纹理,我们需要理解二维图像是如何映射成三维模型的。这个映射过程称为纹理映射。为了进行纹理映射,我们需要在着色器和想要应用纹理的三维模型上下点工夫。模型事实上是由三角形组成的,三角形的每一个顶点可以存储着色器可以访问的数据。UV数据是顶点中存储的诸多重要信息之一。UV数据由两个坐标组成,也就是U和V,取值范围为0到1,它们表示了二维图像中像素映射到顶点时的XY坐标。UV数据只是给顶点用的,三角形内部其他位置上的值则是GPU根据差值算法按照一定的间隔比例去纹理上取的值。下图展示了二维纹理是如何映射到一个三维模型的基础三角形上去的。

UV数据保存在三维模型中,并需要用专门的建模软件才可编辑。某些模型没有UV组件,也就不能支持纹理映射了。比如之前举例的那个斯坦福兔子最开始就没有UV组件。

2.4.1 准备工作

在这一节中,需要一个有UV数据的三维模型及其纹理。在开始之前需要将这二者导入Unity中。你可以直接将其拖曳到Unity编辑器中。标准着色器默认支持纹理映射,所以我们会用这个标准着色器来解释纹理映射是怎么工作的。

2.4.2 操作步骤

使用标准着色器给模型添加纹理非常简单,步骤是:
1. 创建一个新的名为TexturedShader的标准着色器。
2. 创建一个新的名为TexturedMaterial的材质。
3. 通过拖曳将着色器指定给材质。
4. 选中材质后,将纹理拖曳到名为Albedo(RGB)的空长方形中。如果你按照这个步骤进行的话,材质的Inspector标签页应该看起来像这样:

标准着色器知道如何通过UV数据将二维图像映射到三维模型上。

2.4.3 工作原理

当标准着色器在材质的审查器(inspector)中被使用时,纹理映射背后的过程对于开发人员是完全透明的。如果我们想理解它是如何工作的,需要深入看一看TexturedShader。从Properties部分来看,可以发现Albedo(RGB)纹理实际引用的代码是_MainTex:

在CGPROGRAM部分,该纹理被定义为sampler2D—二维纹理的标准类型:

下一行代码是一个名为Input的结构体。这是表面函数的输入参数,这个输入参数包含一个名为uv_MainTex的包装数组:

每次surf()函数被调用时,Input结构会包含三维模型需要渲染的某一个特殊点的_MainTex的UV值。标准着色器会识别出uv_MainTex引用的是_MainTex的值,并且会自动对其进行初始化。如果你对于UV值是如何从三维模型映射到二维纹理上的比较感兴趣,可以看看第3章的内容。
最后,表面函数的第一行中, UV数据被用来对纹理进行采样:

这个过程是通过Cg的tex2D()函数来实现的。该函数接受一个纹理和UV,并返回像素在该位置的颜色值。
 UV坐标都是从0到1,其中(0,0)和(1,1)表示的是两个对顶角。不同的实现方式会把UV和不同的角联系起来。如果你的纹理看起来有点翻转了,试着颠倒一下V的值。

2.4.4 更多内容

当你向Unity导入一个纹理的时候,其实是在给sampler2D准备一些它需要用到的属性。最重要的是Filter(过滤)模式,过滤模式会决定纹理采样时颜色是如何插值的。一般而言,UV数据不会准确指向像素的中心,而其他一些时候你可能需要在最接近的像素间进行插值来让颜色看起来匀称。下图是一个样例纹理的Inspector标签页截图:

对于大部分应用程序,Bilinear(双线性)过滤是一种廉价而又有效的平滑纹理的方式。但是如果你创建的是二维游戏,那么双线性可能产生一些模糊的地方,这时你可以使用Point(点)过滤来移除纹理采样过程的插值。
当我们从一个大倾角观察纹理时,纹理采样通常会产生一些不友好的瑕疵。你可以通过增加Aniso Level的值来减少这些瑕疵,这个改动对于地板和天花板这种类型的纹理非常有效,因为这些纹理中的一些毛刺会破坏视觉的连续性。

2.4.5 参考

如果你想深入了解纹理映射的更多内容,可以查阅下面的网址:
http://http.developer.nvidia. com/CgTutorial/cg_tutorial_chapter03.html。
也可以在下面这个网址找到所有导入二维纹理时的可用选项:

时间: 2024-12-03 13:24:28

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

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

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

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