可将经过常数插值或线性插值的纹理定义为一个返回向量值的函数T(u, v) = (r,g,b,a),即给 定纹理坐标(u,v)∈[0,1]^2,则上述纹理函数T将返回颜色(r,g, b, a)。 Direct3D允许我们采用下列4 种不同方式(即寻址模式,address mode)来扩充此函数的定义域(解决输入值超出定义域这一问 题),它们是重复寻址模式(wrap)、边框颜色寻址模式(border color,也有译作边界颜色寻址模式)、 钳位寻址模式(clamp )与镜像寻址模式(mirror )。
1.重复纹理寻址模式
在 Wrap 纹理寻址模式下,Direct3D 可以在每个整数点重复纹理。
例如,假设应用程序创建平方基元并指定纹理坐标为 (0.0,0.0)、(0.0,3.0)、(3.0,3.0) 以及 (3.0,0.0)。 将纹理寻址模式设置为“Wrap”会使纹理在 u 和 v 方向应用三次,如下图所示。
2.镜像纹理寻址模式
在镜像纹理寻址模式下,Direct3D 可以每个整数为界映射纹理。
例如,假设应用程序创建平方基元并指定纹理坐标为 (0.0,0.0)、(0.0,3.0)、(3.0,3.0) 以及 (3.0,0.0)。 将纹理寻址模式设置为“镜像”会使纹理在 u 和 v 方向应用三次。 纹理应用到的所有其他行和列均为前一行或前一列的镜像,如下图所示。
3.Clamp 纹理寻址模式
在 Clamp 纹理寻址模式下,Direct3D 可以将纹理坐标固定到 [0.0, 1.0] 范围;在 Clamp 模式下应用纹理一次,边缘像素颜色会变模糊。
例如,假设应用程序创建了一个平方基元,并将 (0.0,0.0)、(0.0,3.0)、(3.0,3.0) 以及 (3.0,0.0) 纹理坐标分配至该基元的顶点。 将纹理寻址模式设置为"Clamp"会使纹理应用一次。 列顶部和行结尾的像素颜色将分别延伸到基元的顶部和右侧。
下图所示为固定的纹理。
在边框颜色纹理寻址模式下,对于超出 0.0-1.0(包括这两者)范围的任何纹理坐标,Direct3D 可以使用任意颜色(称为边框颜色)。
在下图中,应用程序指定必须将纹理应用到使用红色边框的的基元。
在Direct3D中,寻址模式由枚举类型 D3D12_TEXTURE_ADDRESS_MODE 来表示:
enum D3D12_TEXTURE_ADDRESS_MODE
{
D3D12_TEXTURE_ADDRESS_MODE_WRAP = 1, //重复纹理寻址模式
D3D12_TEXTURE_ADDRESS_MODE_MIRROR = 2,//镜像寻址模式
D3D12_TEXTURE_ADDRESS_MODE_CLAMP = 3,//钳位寻址模式
D3D12_TEXTURE_ADDRESS_MODE_BORDER = 4,//边框颜色寻址模式
D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE = 5
}
设备限制
尽管系统一般情况下支持超出 0.0-1.0(包括这两者)范围的纹理坐标,但硬件限制通常会影响纹理坐标可超出的范围。 当你检索设备功能时,呈现设备将显示对设备所允许的所有纹理坐标的限制。
例如,如果限值为 128,则输入的纹理坐标必须控制在 -128.0 至 +128.0 的范围内。 使超出该范围的纹理坐标通过顶点是无效的。 相同的限制适用于因纹理坐标自动生成以及纹理坐标变换而生成的纹理坐标。
纹理重复限制取决于按纹理坐标编索引的纹理的大小。 假设在此情况下,纹理大小为 32,设备允许的纹理坐标的范围为 512,则实际有效的纹理坐标范围应为 512/32 = 16,也就是说,该设备的纹理坐标范围必须介于 -16.0 至 +16.0。