DirectX11-纹理和纹理坐标

  • Post author:
  • Post category:其他



纹理


纹理的定义

纹理是一种普遍存在的视觉现象 , 人们可以去感受纹理 ,却很难对纹理的精确定义形成统一的认识。目前尚无一个被广泛接受的纹理定义 。

一般认为 , 纹理是图像灰度或色彩在空间上的变化或重复 。

我们的演示程序正在变得越来越有趣,但是顶点颜色无法体现真实世界物体所具有的细节。纹理贴图映射(texture mapping)是一种将图像数据映射到三角形表面的技术,它可以显著提高场景的细节和真实感。例如,我们可以创建一个立方体,然后将一个板条箱纹理映射到立方体的每个面上,使它看上去更像是一个板条箱(参见图 8.1)。



图 8.1 :板条箱演示程序创建了一个带有板条箱纹理的立方体。


纹理坐标

Direct3D 的纹理坐标系由表示图像水平方向的 u 轴和表示图像垂直方向的 v 轴组成。坐标(u,v)指定了纹理上的一个元素,我们将该元素称为纹理元素(texel,译者注:texel是textureelement的缩写),其中 0≤u,v≤1。注意,v 轴的正方向是“垂直向下”的参见图 8.2)。另外,将规范化坐标区间设为[0,1],是因为这样可以使 Direct3D 拥有一个独立于纹理尺寸的坐标空间;例如,无论纹理的实际尺寸是 256×256、512×1024 还是 2048×2048,(0.5, 0.5)永远表示中间的纹理元素。同样,(0.25, 0.75)表示在水平方向上位于总宽度的1/4 处、在垂直方向上位于总高度的3/4 处的纹理元素。现在,我们只讨论[0,1]区间内的纹理坐标,稍后会讲解当纹理坐标超出一范围时的处理方法。


图 8.2 纹理坐标系(texture coordinate system) ,有时也称为纹理空间(texture space)。


对于每个 3D 三角形,我们都要在纹理上定义一个相应的 2D 三角形,以使纹理映射到3D 三角形上(参见图 8.3)。


图 8.3 左图是 3D 空间中的一个三角形 ,右图是我们在纹理上定义的 2D 三角形 ,它会被映射到 3D 三角形上。

若三角形的顶点坐标为 p 0 ,p 1 和 p 2 ,对应的纹理坐标为 q 0 、q 1 和 q 2 。对于 3D 三角形上的任意一个点(x,y,z),它的纹理坐标(u,v)都可以通过在 3D 三角形表面对顶点纹理坐标进行线性插值得到,而线性插值中的参数 s、t 是相同的;也就是说:

 

 

若 s≥0,t≥0,s+t≤1 则,

 

   

通过一方式,三角形上的每个点都可以得到一个相应的纹理坐标。

为了使用纹理,我们需要再次修改顶点结构体,添加一对纹理坐标,指定纹理上的点,使每个 3D 点都有一个相应的 2D 纹理点。这样,由 3 个顶点构成的每个 3D 三角形在纹理空间中都会有一个相应的 2D 纹理三角形(即,在每个 2D 纹理三角形和 3D 三角形之间建立对应关系)。


注意

:你可以创建一个 2D 纹理三角形和 3D 三角形差别很大的“奇怪”纹理映射。结果是,当这个 2D 纹理映射到 3D 三角形上时,会出现拉伸和扭曲,看起来不好。例如,将一个尖三角形映射到一个正三角形上就会发生拉伸现象。通常,纹理扭曲应尽量避免,除非艺术家期望这种扭曲的效果。看一下图 8.3,我们将整张纹理映射到立方体的每个面上,但这并不是必须的。我们可以只将纹理的一部分映射到几何体上。我们可以将几张毫不相关的图像合并在一张大纹理贴图上(叫做纹理贴图集textureatlas),然后将它用于不同的对象(图 8.4)。纹理坐标决定了将那一部分纹理映射到三角形上。


图 8.4. 一张存储了 4 张纹理的纹理贴图集。设置每个顶点的纹理坐标就可以将期望的部分纹理映射到几何体上。



版权声明:本文为qq_44032231原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。