《Real-Time Rendering 4th Edition》全文翻译 - 第6章 纹理化(上)6.1 ~ 6.3

由于工作变动原因,这次翻译拖的时间比较长……抱歉啦!

其实也是由于每章的内容越来越多了,很难在短时间内翻译完,是个很磨人的事情。

不过我会坚持下去的!希望能更多地帮到大家吧!

业余翻译,若有不周到之处,还请多多指教。

实时渲染(第四版)Real-Time Rendering (Fourth Edition)

第6章 纹理化 Chapter 6 Texturing

“All it takes is for the rendered image to look right.”    — Jim Blinn
 

“所需要做的仅是为了使渲染图像看起来正确。” —— 吉姆·布林

(注:吉姆·布林,美国计算机科学家,他的 Blinn-Phong 着色模型在业内无人不知,无人不晓)

表面的质感就是外观和感觉 —— 只要想一想油画的质感就知道了。在计算机图形学中,纹理化是获取表面并使用某些图片、函数或其他数据源在每个位置修改其外观的过程。例如,显示砖墙时,我们不是精确地去表示砖墙的几何形状,而是将砖墙的彩色图片应用于两个三角形组成的矩形上。查看矩形时,彩色图片会显示在矩形所在的位置。除非观察者很靠近墙壁,否则缺少的几何细节是不会引起注意的。

然而,某些带纹理的砖墙可能会因为缺乏几何形状而无法令人信服。例如,如果砂浆应该是哑光的(matte),而砖块是光滑的(glossy),则观察者会注意到两种材料的粗糙度相同。为了产生更令人信服的体验,我们可以在表面上应用第二个图片纹理。根据表面上的位置,此纹理可以更改墙壁的粗糙度,而不是更改表面的颜色。现在,砖和灰浆的图片纹理具有颜色,而新纹理具有粗糙度值。

观看者可能会看到现在所有砖块都是光滑的,而砂浆不是,但是请注意,每个砖块表面看起来都非常平坦。这看起来是不对的,因为砖的表面通常会有一些不规则的起伏。通过应用凹凸贴图(bump mapping),我们就可以改变砖块的着色法线,以便在渲染砖块时,使它们看起来并不十分平滑。这种纹理会扰动矩形原始表面法线的方向,以用于计算光照。

然而从低角度观看,这种凹凸不平的错觉可能会瓦解。砖块应突出在砂浆上方,以使其看不见。即使从直视角度看,砖块也应该将阴影投射到砂浆上。视差贴图(Parallax mapping)使用一张纹理让平面在渲染时似乎变形了,而视差遮蔽贴图(parallax occlusion mapping)将射线投射到高度场纹理上以提高真实感。位移贴图(Displacement mapping)通过修改形成模型的三角形高度来真正位移曲面。图 6.1 显示了带有颜色纹理和凹凸贴图的示例。

图6.1. 纹理化。将颜色和凹凸贴图应用于此鱼以增加其视觉细节水平。(图片由Elinor Quittner提供。)

 

这些是可以通过纹理解决的问题类型的示例,使用了越来越复杂的算法。在本章中,将详细介绍纹理化技术。首先,会介绍纹理化过程的一般框架。接下来,我们会专注于使用图片对表面进行纹理化处理,因为这是实时工作中最流行的纹理化形式。简要讨论了程序纹理,然后说明了使纹理影响表面的一些常用方法。

 

6.1 纹理化管线 The Texturing Pipeline

纹理化是一种用于有效地对表面材质的变化建模的技术(?)。探讨纹理化的一种方法是去思考单个着色像素在此过程中会发生什么。如上一章所述,我们通过考虑材料的颜色和灯光以及其他因素来计算着色。如上一章所述,通过考虑材质的颜色和灯光以及其他因素来计算着色。如果存在半透明物体的话,透明度也会影响采样。我们通过修改着色方程式中使用的值来进行纹理化。这些值的更改方式通常基于表面上的位置。因此,对于砖墙的示例,我们会根据表面位置,用砖墙图片中的相应颜色替换表面上任何点的颜色。图片纹理中的像素通常称为纹理像素(texels)(注:简称纹素),以区别于屏幕上的像素。粗糙度纹理会修改粗糙度值,而凹凸纹理会更改着色法线的方向,因此每个图片纹理都会改变着色方程式的结果。

纹理化过程可以通过概括的纹理管线来描述。稍后我们将介绍许多术语,但请振作精神:管线的每个部分都将被详细介绍。

在空间中的位置是纹理化过程的起点。该位置可以位于世界空间中,但通常位于模型的参照系中,因此随着模型的移动,纹理也随之移动。用 Kershaw 的术语 [884] 来描述,此空间点上已应用了投影函数(projector function),以便获得一组被称为纹理坐标(texture coordinates)的数值,这些数值将用于访问纹理。此过程称为映射(mapping),也通常被称为纹理映射(texture mapping)。有时纹理图片本身就被称为纹理贴图(texture map),尽管严格来说这并非正确。

在将这些新值用于访问纹理之前,可以使用一个或多个匹配函数将纹理坐标转换为纹理空间。这些纹理空间的位置用于从纹理中获取值,例如,它们可以是图片纹理中的数组索引,以便检索像素。然后,取回的值可能会通过值转换函数再次进行转换,最后,这些新值将用于修改曲面的某些属性,例如材质或着色法线。图 6.2 详细展示了应用单个纹理的过程。管线复杂的原因是每个步骤都为用户提供了有用的控件。应该注意的是,并非所有步骤都需要始终保持激活。

图 6.2. 单个纹理的概括纹理管线。

图 6.3. 砖墙的管线。

 

我们使用该管线,当三角形具有砖墙纹理并且在其表面上生成样本时,具体发生的事情如图(见图 6.3)。首先找到对象的局部参照系中的(x,y,z)位置; 假设是(−2.3,7.1,88.2)。然后将投影函数应用于此位置。正如世界地图是将三维对象投影到二维中一样,此处的投投影函数通常将(x,y,z)向量更改为二维向量(u,v)。此示例中使用的投影函数等效于正交投影(第2.3.1节),其作用类似于幻灯片投影仪,将砖墙图片照在三角形的表面上。回到墙这边,可以将其表面上的一个点转换为一对值,范围从 0 到 1 。这里假设获得的值为(0.32,0.29)。这些纹理坐标将用于查找此位置的图像颜色。我们砖墙纹理的分辨率为 256 × 256,因此匹配函数会将(u,v)分别乘以 256,得出(81.92,74.24)。弃掉小数点,在砖墙图片中对应像素为(81,74),它的颜色为(0.9,0.8,0.7)。纹理颜色位于 sRGB 颜色空间中,因此,如果要在着色方程式中使用该颜色,则将其转换为线性空间,得到(0.787,0.604,0.448)(第5.6节)。

 

6.1.1 投影函数 The Projector Function

纹理处理的第一步是获取表面的位置并将其投影到纹理坐标空间中,通常是二维(u,v)空间。建模包(Modeling packages)通常允许美术师定义每个顶点的(u,v)坐标。这些可以从投影函数或网格展开算法来初始化。美工可以用编辑顶点位置的相同方式来编辑(u,v)坐标。投影函数通常通过将空间中的三维点转换为纹理坐标来工作。建模程序中常用的投影函数包括球形投影,圆柱形投影和平面投影 [141、884、970]

图 6.4. 不同的纹理投影。从左到右显示了球形,圆柱形,平面和自然(u,v)投影。底行显示了应用于单个对象(没有自然投影)的所有这些投影。

 

其他的输入可用于投影函数。例如,可以使用表面法线来选择将六个平面投影方向中的哪个用于该表面。面部相接处的接缝处会出现纹理匹配问题; Geiss [521,522] 讨论了一种将它们混合的技术。Tarini 等人 [1740]描述了多立方体贴图(polycube maps),其中一个模型被映射到一组立方体投影,而不同体积的空间映射到不同的立方体。

其他投影函数则不进行投影,但是它们是表面创建和细分(surface creation and tessellation)的隐含部分。例如,参数化曲面具有自然的(u,v)值集作为其定义的一部分。见图 6.4。纹理坐标也可以根据各种不同的参数生成,例如视图方向,表面温度或其他任何你能想到的参数。投影函数的目标是生成纹理坐标。将它们推导为位置的函数只是生成纹理坐标的一种方法。

非交互式渲染器通常将这些投影函数称为渲染过程本身的一部分。单个投影函数可能就足以满足整个模型的需要,但美术人员通常必须使用工具来划分模型并分别应用各种投影函数 [1345]。参见图 6.5。

图 6.5. 各种纹理投影是如何被应用在单个模型上。盒式映射(Box mapping)由六个平面映射组成,每个盒子面都有一个映射。(图片由 Tito Pag´an 提供。)

 

在实时渲染中,通常在建模阶段应用投影函数,并将投影结果存储在顶点上。然而并非总是如此; 有时在顶点或像素着色器中应用投影函数也是有利的。这么做可以提高精度,并有助于启用各种效果,包括动画(第6.4节)。一些渲染方法,例如环境映射(environment mapping)(第10.4节),具有自己的专用的投影函数,并且这些函数都会逐像素进行计算。

球形投影(图 6.4 的左侧)将点投射到以某个点为中心的假想球体上。此投影与 Blinn 和 Newell 的环境映射方案(第10.4.1节)中使用的投影相同,因此第 407 页的公式 10.30 描述了此函数。这种投影方法也遇到了该部分所述的相同的顶点插值问题。

圆柱形投影计算的 u 纹理坐标与球形投影相同,而 v 纹理坐标计算为沿圆柱轴的距离。此投影对于具有自然轴的对象,例如旋转表面(surfaces of revolution),是很有用的。另外,当曲面与圆柱轴接近垂直时,会发生变形现象。

平面投影就像 X 射线一样,沿着一个方向进行平行投影,并将纹理应用于所有表面。它使用正交投影(第4.7.1节)。举个例子,这种类型的投影可用于贴花(decals)(第20.2节)。

由于投影方向边缘的曲面存在严重的变形,因此美术人员通常必须手动将模型分解为近似平面的部分。还有一些工具可通过展开网格,或是创建一组接近最佳的平面投影来帮助其最大程度地减少变形,或者通过其他方式辅助此过程。我们的目标是使每个多边形在纹理区域中享有更公平的份额,同时还要保持尽可能多的网格连接。连接性很重要,因为采样伪像(artifacts)可以沿着纹理的各个单独部分相遇的边缘出现。具有良好展开效果的网格也可以简化美术人员的工作 [970,1345]。16.2.1 节讨论了纹理变形如何对渲染产生不利影响。图 6.6 展示了用于创建图 6.5 中的雕像的工作空间。这种展开过程是网格参数化这一较大研究领域的一个方面。有兴趣的读者可以参考 Hormann 等人的 SIGGRAPH 课程笔记。[774]

图 6.6. 雕像模型的几个较小的纹理,保存为两个较大的纹理。右图显示了三角形网格如何展开并显示在纹理上以帮助其创建。(图片由Tito Pag´an提供。)

 

纹理坐标空间并不总是二维平面。有时是三维体积。在这种情况下,纹理坐标表示为三元向量(u,v,w),其中 w 为沿投影方向的深度。其他系统最多使用四个坐标,通常指定为(s,t,r,q)[885]; q 用作齐次坐标中的第四个值。它的作用类似于电影或幻灯片的投影仪,投影纹理的大小随距离而增加。举个例子,对于将装饰性聚光图案(称为 gobo)投影到舞台或其他表面上来说,它是很有用的 [1597]

纹理坐标空间的另一种重要类型是方向型,其空间中的每个点都可以通过输入方向访问。可视化这种空间的一种方法是将其作为单位球面上的点,每个点上的法线表示用于访问该位置纹理的方向。使用方向参数化的最常见纹理类型是立方体贴图(cube map
)(第6.2.4节)。

另外还值得注意的是,一维纹理图像和函数也有其用途。例如,在地形模型上,可以通过其高度确定颜色,例如低地是绿色,山峰是白色。线条也可以进行纹理化;其中一种用法是将雨水渲染为一组带有半透明图像的长线。此外,这种纹理对于从一个值转换为另一值,即作为查找表,也是有用的。

由于可以将多个纹理应用于一个表面,因此可能需要定义多组纹理坐标。但如果是应用坐标值的话,思路是相同的:这些纹理坐标在表面上插值并用于检索纹理值。然而在插值之前,这些纹理坐标会由匹配函数转换。

 

6.1.2 匹配函数 The Corresponder Function

匹配函数们将纹理坐标转换为纹理空间位置。它们提供了将纹理应用于表面的灵活性。匹配函数的一个应用案例就是使用 API 选择现有纹理的一部分进行显示;只有该子图像才会传递到后续操作流程中使用。

匹配函数的另一种类型是矩阵变换,可以将其应用于顶点或像素着色器。这样就可以在表面上平移,旋转,缩放,剪切或投影纹理。正如第 4.1.5 节所述,转换的顺序很重要。但令人惊讶的是,纹理转换的顺序必须与预期的顺序相反。这是因为纹理变换实际上会影响确定查看图像位置的空间。图像本身并不是要转换的对象;定义图片位置的空间正在被更改。

还有另一类匹配函数控制应用图像的方式。我们知道图像将出现在(u,v)处于 [0,1] 范围内的表面上。但是超出此范围会发生什么?此情况下匹配函数会确定其具体行为。在OpenGL中,这种类型的匹配函数被称为“包装模式”(wrapping mode);在DirectX 中,它被称为“纹理寻址模式”(texture addressing mode)。这种类型的常见匹配函数分别是:

  • 包裹(wrap)(DirectX),重复(repeat)(OpenGL),或图块 —— 图像在整个表面上重复;在算法上,将丢弃纹理坐标的整数部分。此函数对于使材质的图像重复并覆盖表面很有用,并且这通常是默认设置。
  • 镜像(mirror)—— 图像在整个表面上重复,但在其他每个重复上都被镜像(翻转)。例如,图像通常从0到1出现,然后在1和2之间反转,然后在 2 和 3 之间正常,然后反转,依此类推。这可以让纹理边缘带有连续性。
  • 夹取(clamp)(DirectX)或夹取到边缘(clamp to edge)(OpenGL)—— 超出 [0,1] 范围的值都将被夹取到该范围。这会导致图像纹理的边缘像素不断重复。此函数对于在纹理的边缘附近采用双线性插值时,避免意外地从纹理的相对边缘进行采样 [885] 很有用。
  • 边框(border)(DirectX)或夹取到边框(clamp to border)(OpenGL)—— [0,1] 以外的纹理坐标使用单独定义的边框颜色进行渲染。例如,由于纹理的边缘将与边框颜色平滑融合,因此该函数可以很好地将贴图渲染到单色表面上。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值