纹理坐标

Direct3D支持广泛的纹理特性设置,使程序员可以轻松的访问提供高级纹理技术。下面我们来讨论Direct3D中的纹理的一些内容:
1. 纹理的基本概念
2. 纹理句柄
3. 纹理接口
4. 纹理过滤
5. 纹理Wrapping
6. 纹理融合
7. 纹理压缩
8. 自动纹理管理
9. 对于纹理的硬件考虑
1. 纹理的基本概念
这一部分中讲述了Direct3D中有关纹理的一些概念,我们分以下几个部分来分别讨论:
1.1 什么是纹理
1.2 纹理坐标
1.3 纹理寻址模式
1.4 纹理句柄和纹理接口
1.5 调板纹理
1.1 什么是纹理?
早期的计算机生成的3-D图象,它们的表面看起来就象是一个发亮的塑料表面。它们总是缺少一些能使物体看起来更加真实的东西,如表面的磨损、裂纹、人手的印记或是一些污
点等等。近几年来,纹理的使用使得计算机三维图象具有了更好的真实感。
一个纹理实际上就是一个位图。从这个意义上来讲,当纹理一词被用于计算机图形学时,它就有了一个明确的定义。从语义学角度来讲,纹理一词既是指一个物体上颜的模式,又是指物体表面是粗糙的还是光滑的。Direct3D的纹理不会使物体表面真的变得崎岖不平,而只是使它的表面看起来是崎岖不平的。
由于Direct3D的纹理就是简单的位图,因此任何纹理否可以被用在Direct3D图元上。例如,我们可以创建一些具有木头和谷物图案的对象;也可以将一些青草、泥土和岩石用于一些三维图元,并将它们堆成一座小山,这样就有了一个山坡的背景;或者搞一些路标、悬崖等等。
另外,Direct3D还支持一些高级的纹理技术,如纹理融合(透明或不透明)、光线映射(light mapping)等。
如果程序创建了一个HAL设备、MMX设备或RGB设备,它就可以使用8-16-24-32-bit纹理。使用单设备的程序可以使用8-bit纹理。
1.2 纹理坐标
纹理实际上是一个二维数组,它的元素是一些颜值。单个的颜值被称为纹理元素(texture elements纹理像素texel。每一个纹理像素在纹理中都有一个唯一的地址。这个地址可以被认为是一个列(column)和行(row)的值,它们分别由UV来表示。
纹理坐标位于纹理空间中。也就是说,它们和纹理中的(0,0)位置相对应。当我们将一个纹理应用于一个图元时,它的纹理像素地址必须要映射到对象坐标系中。然后再被平移到屏幕坐标系或像素位置上。
Direct3D直接将纹理空间中的纹理像素映射到屏幕空间中的像素,跳过了中间过程,从而提高了效率。这一映射过程实际上是一个相反的(inverse)映射。也就是说,对于屏幕空间中的每一个像素,我们来计算相应的纹理空间中的纹理像素位置。对那一点上的或那一点周围的纹理颜进行采样(sample)。采样过程被称为纹理过滤(texture filtering)。
纹理中的每一个纹理像素可以通过它的坐标来声明。但是,为了将纹理像素映射到图元上,对于所有纹理上的所有纹理像素,Direct3D需要有一个统一的地址范围。因此,它使用了一个通用的地址方案,在这个方案中所有纹理像素地址的范围都在0.01.0之间,包括0.01.0Direct3D程序用UV的值来声明纹理坐标,它和用xy坐标来声明二维迪卡尔坐标系一样。
在这种情况下,不同纹理中的同一纹理地址又可能被映射为不同的纹理像素坐标。如左面插图中的纹理地址(0.0,0.5)。由于纹理的大小有所不同,因此纹理地址将会映射为不同的纹理像素。左边的纹理1,大小为5x5光纤电流互感器,纹理地址(0.0,0.5)映射到纹理像素(0,2);右边的纹理2,大小为7x7,纹理地址(0.0,0.5)映射到纹理像素(0,3)
左图展示了一个简单的纹理像素映射的过程:
我们要给图中左边的像素确定一定的颜。像素四个角的地址被映射到对象空间中的图元上,这时,像素的形状会有一些变形,这是由图元的形状和观察的角度造成的。然后,与像素角相对应的图元表面上的几个角被映射到纹理空间中。这一映射过程再次使像素的形状产生变形。像素最终的颜值就由该像素映射到的区域中的纹理像素计算而得。在设置纹理过滤方法时,要决定Direct3D使用什么方法来得到像素的颜。
程序可以直接将纹理坐标分配给顶点。这一能力使我们能够控制将一个纹理的哪些部分映射到一个图元上。现在假定我们要创建一个矩形图元,它的大小恰好与下图中纹理的大小一样。我们要将整个纹理都映射到一整堵墙上,那么分配给图元顶点的纹理坐标就应该是(0.0,0.0)(1.0,0.0)(1.0,1.0)(0.0,1.0)
现在我们要将墙的高度缩小一半。我们可以将纹理变形以适应墙的变化,也可以在分配纹理坐标时只使用纹理的下面一半。
如果使用纹理变形或缩放的方法,那么所使用的纹理过滤方法就会对图象的质量产生影响。详细内容见纹理过滤
如果采用分配纹理坐标的方法,那么分配给图元顶点的纹理坐标就应该是(0.0,0.0)(1.0,0.0)(1.0,0.5)(0.0,0.5)Direct3D会将纹理的下面一半应用到墙上。
有时,一个顶点的纹理坐标可能比1.0大。当分配给顶点的纹理坐标不在0.01.0(包括它们)范围内时,就要设置纹理寻址模式了。
1.3 纹理寻址模式
下面我们来讨论多源Direct3D纹理寻址模式。
1.3.1 什么是纹理寻址模式?
1.3.2 Wrap纹理寻址模式
1.3.3 镜像纹理寻址模式
1.3.4 钳位(clamp)纹理寻址模式
1.3.5 边界颜纹理寻址模式
1.3.6 设置并恢复纹理寻址模式
1.3.7 纹理寻址模式和纹理Wrapping
1.3.1 什么是纹理寻址模式?
Direct3D程序可以将纹理坐标分配给任何图元的顶点。一般来说,分配的UV纹理坐标值都在0.01.0范围内(包括它们)。但是,如果我们分配了超出这个范围的纹理坐标,可能会得到一些特别的纹理效果。
通过设置纹理寻址模式,我们就可以在纹理坐标超出范围时进行控制。详细的内容请看下面的相关讨论:
Wrapping纹理寻址模式
镜像纹理寻址模式
钳位纹理寻址模式
边界颜纹理寻址模式新语文活页
1.3.2 Wrapping纹理寻址模式
“Wrapping”纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_WRAP医院阻尼器成员来确定,它使Direct3D在每一个整数结点(integer junction)对纹理进行重复。假设我们要创建一个正方形图元,并将纹理坐标声明为(0.0,0.0)(0.0,3.0)(3.0,3.0)(3.0,0.0)。这时,如果我们设置了纹理寻址模式,就可以使纹理在UV方向都重复三次。,如下图所示:
李芸昕
这种纹理寻址模式的效果与镜像模式比较相似,但在本质上是不同的。
1.3.3 镜像纹理寻址模式
镜像纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_MIRROR成员来确定,它使Direct3D在每个整数边界处(integer boundary)对纹理进行镜像处理。想在我们创建一个正方形图元,为坐标为(0.0,0.0)(0.0,3.0)(3.0,3.0)(3.0,0.0)。我们设置镜像纹理寻址模式,纹理在UV方向都重复了三次,并且每一行、每一列都与相邻的行和列成镜像关系。如下图所示:
镜像纹理寻址模式的效果与Wrapping寻址模式比较相似,但本质上是不同的。
1.3.4 钳位纹理寻址模式
钳位纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_CLAMP成员确定,它使Direct3D将纹理坐标钳制在[0.0, 1.0]范围内。也就是说,它只使用一次纹理,然后将边缘像素的颜抹去。我们创建一个正方形图元,纹理地址分配为(0.0,0.0)(0.0,3.0)(3.0,3.0)(3.0,0.0)。这时,设置钳位纹理寻址模式,纹理将只使用一次,并且最顶一行和最后一列上的像素颜会一直延伸到图元的最顶端和最右段,如下图所示:
1.3.5 边界颜纹理寻址模式
边缘颜纹理寻址模式由D3DTEXTUREADDRESS枚举类型的D3DTADDRESS_BORDER成员确定,它使Direct3D可以在纹理坐标超过范围的地方使用一个任意的颜,也就是边界颜。汉语翻译
下图中展示了一个使用了纹理的图元,它使用了红的边界:
程序如何来设置边界依赖于使用什么版本的Direct3D设备接口。如果程序使用IDirect3DDevice3接口,可以调用IDirect3DDevice3::SetTexture平台State来设置边界颜。
将第一个参数设为要调用的纹理stage标识符,第二个参数设置为D3DTSS_BORDERCOLOR平台状态值,第三个参数为RGBA边界颜。

本文发布于:2024-09-22 13:40:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/145881.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:纹理   模式   寻址   像素   坐标   使用
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议