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

简介:

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

2.4 给着色器添加纹理

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

image

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

2.4.1 准备工作

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

2.4.2 操作步骤

使用标准着色器给模型添加纹理非常简单,步骤是:

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

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

2.4.3 工作原理

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

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

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

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

最后,表面函数的第一行中, UV数据被用来对纹理进行采样:
image

这个过程是通过Cg的tex2D()函数来实现的。该函数接受一个纹理和UV,并返回像素在该位置的颜色值。

 UV坐标都是从0到1,其中(0,0)和(1,1)表示的是两个对顶角。不同的实现方式会把UV和不同的角联系起来。如果你的纹理看起来有点翻转了,试着颠倒一下V的值。

2.4.4 更多内容

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

image

对于大部分应用程序,Bilinear(双线性)过滤是一种廉价而又有效的平滑纹理的方式。但是如果你创建的是二维游戏,那么双线性可能产生一些模糊的地方,这时你可以使用Point(点)过滤来移除纹理采样过程的插值。

当我们从一个大倾角观察纹理时,纹理采样通常会产生一些不友好的瑕疵。你可以通过增加Aniso Level的值来减少这些瑕疵,这个改动对于地板和天花板这种类型的纹理非常有效,因为这些纹理中的一些毛刺会破坏视觉的连续性。

2.4.5 参考

如果你想深入了解纹理映射的更多内容,可以查阅下面的网址:

http://http.developer.nvidia. com/CgTutorial/cg_tutorial_chapter03.html。

也可以在下面这个网址找到所有导入二维纹理时的可用选项:

image

相关文章
|
5月前
|
算法 vr&ar C#
使用Unity进行虚拟现实开发:深入探索与实践
【8月更文挑战第24天】使用Unity进行虚拟现实开发是一个充满挑战和机遇的过程。通过掌握Unity的VR开发技术,你可以创造出令人惊叹的VR体验,为用户带来前所未有的沉浸感和乐趣。随着技术的不断进步和应用场景的不断拓展,VR开发的未来充满了无限可能。希望本文能为你提供有用的指导和启发!
|
5月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
47 2
|
5月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
53 2
|
4月前
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
345 0
|
4月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
62 0
|
4月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
163 0
|
5月前
|
vr&ar 图形学 开发者
步入未来科技前沿:全方位解读Unity在VR/AR开发中的应用技巧,带你轻松打造震撼人心的沉浸式虚拟现实与增强现实体验——附详细示例代码与实战指南
【8月更文挑战第31天】虚拟现实(VR)和增强现实(AR)技术正深刻改变生活,从教育、娱乐到医疗、工业,应用广泛。Unity作为强大的游戏开发引擎,适用于构建高质量的VR/AR应用,支持Oculus Rift、HTC Vive、Microsoft HoloLens、ARKit和ARCore等平台。本文将介绍如何使用Unity创建沉浸式虚拟体验,包括设置项目、添加相机、处理用户输入等,并通过具体示例代码展示实现过程。无论是完全沉浸式的VR体验,还是将数字内容叠加到现实世界的AR应用,Unity均提供了所需的一切工具。
184 0
|
5月前
|
测试技术 C# 图形学
Unity3D学习笔记10——纹理数组
Unity3D学习笔记10——纹理数组
60 0
|
5月前
|
存储 算法 C#
Unity3D学习笔记2——绘制一个带纹理的面
Unity3D学习笔记2——绘制一个带纹理的面
34 0
|
7月前
|
存储 图形学
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
169 0