导言
本章介绍了如何创建纹理采样器并应用于3D图形贴图。最简单的形式,纹理是图像(二维数组的像素信息)是适用于表面的三维形状。图像可以使用tga,jpeg , png ,或DDS的格式。使用一个纹理采样器,需要先设置的一些状态参数,以说明如何适用纹理的形状。
立方体贴图的例子展示了创建六个面并对每个面进行贴图的过程。
关于纹理
O3D使用字符代表横向坐标和字符V代表垂直纹理坐标。纹理坐标( U ,V)的范围从( 0.0 , 0.0 )图像左下角到( 1.0 , 1.0 )图像的右上角,如下所示:
在O3D 中,纹理也可以是三维立方体。立方体纹理存储一个立方体六个面的纹理图像,并处理三个纹理坐标(u, v 和 w)。应用立方体纹理效果,大致类似收缩包装上的纹理,其图形是封闭的立方体。
纹理采样器
概括的说,纹理采样器是一系列贴图对象及将贴图对象应用到3D模型上的state等。纹理采样器定义了一下属性(默认值在括号内):
addressModeU(WRAP) 定址模式
- addressModeV (WRAP)
- minFilter (LINEAR)
- magFilter (LINEAR)
- mipFilter (POINT)
- borderColor (Float4(0,0,0,0)
- maxAnisotropy (1)
1、定址模式
该addressModeU和addressModeV属性规定了纹理坐标范围超过的0.0到1.0时进行何种处理操作。如下图的贴图例子所示,贴图区域的U和V方向都是0.0到2.0,可以用不同的定址模式来解决这个问题,具体参数设置如下:
值
意义
WRAP
(默认为此值)重复贴图来填充贴图区域
MIRROR
重复贴图,当遇到UV的边界时反向(UV边界为0.0或者1.0)
CLAMP
用贴图的最后一行像素,重复覆盖没贴到的区域
BORDER
超过的贴图区域,用一种特殊颜色的边标记出来
2、缩小过滤
该缩小过滤器( minFilter )规定如何适用纹理如果该地区的质感较少像素比纹理(即纹理需要缩小,以填补该地区) 。可能过滤类型minFilter如下:值
意义
POINT
用最接近的像素
LINEAR
用线性插值法在相邻像素之间,并使用插值之后的结果
ANISOTROPIC
不按比例拉伸贴图,直到贴满整个区域
如果minFilter设置点或直线,一个mipmap过滤器( mipFilter )可以用来控制插值纹理值。如果mipFilter设定为无,这就被忽视。见下面的Mipmap过滤器。
3、Mipmap过滤器
创建缩小版的贴图比放大贴图更困难。需要将更多的精力放在避免切图时边缘的处理上,防止产生锯齿现象。Mipmapping指贴图的过程中减少材质的使用代替原来的巨型纹理。Mipmapping指的过程中创造了一套减少纹理使用,取代原来的全尺寸的纹理。通常的技术是根据原来的纹理,创建新的纹理尺寸是原来纹理的一半,并继续这一过程,直到减少纹理到一个像素大小。当贴图缩小到合适的尺寸时,设置mipFilter 的值如下:mipFilter的值
意义
NONE
不使用mipmap
POINT
使用最接近三角形的mipmap标准。使用缩小过滤器(
minFilter
)处理贴图LINEAR
4、放大过滤器
放大过滤器( magFilter )规定如何适用纹理如果该地区的质感包含的像素比纹理(即纹理需要加以延伸,以填补该地区) 。这种放大会导致图像模糊。可能过滤类型magFilter如下:值
意义
POINT
点使用最接近像素。
LINEAR
在相邻像素之间使用线性插值
5、边框颜色
当定址模式设置为BORDER, borderColor应用于任何纹理坐标在0.0到1.0范围界定的像素。如下图,纹理贴图实例中的右上角的贴图,超出边界的部分边框颜色为红色。
6、各向异性(Anisotropy)
当minFilter的值被设为ANISOTROPIC时,maxAnisotropy值指定了各向异性的程度。各向异性过滤考虑到纹理像素间的距离,以及纹理贴图被观察的角度。7、例子
下图是贴图例子,后面表格中的内容对应每个贴图对象的属性值:
左上角
中上
右上角
- addressModeU = Sampler.WRAP
- addressModeV = Sampler.WRAP
- minFilter = Sampler.LINEAR
- magFilter = Sampler.LINEAR
- mipFilter = Sampler.POINT
- borderColor = Float4(0, 0, 0, 0)
- maxAnisotropy = 1
- minFilter = Sampler.ANISOTROPIC
- maxAnisotopy = 4
- addressModeU = Sampler.BORDER
- addressModeV = Sampler.BORDER
- borderColor = Float4(1, 0, 0, 1)
左下角
中下
右下角
minFilter = Sampler.POINT
Uses default (LINEAR) filtering; 和上面的贴图作对比
- addressModeU = Sampler.MIRROR
- addressModeV = Sampler.MIRROR