借助纹理映射,可以将图像数据映射到三角形单元中,这能显著地增加所绘制场景的细节和真实感。
在Dirext3D中纹理用接口IDirect3DTexture9来表示。
1.纹理坐标
由沿水平方向上的U轴和沿竖直方向上的V轴构成。图片的左上角(u,v)=(0,0)。当使用纹理坐标式,需在灵活顶点格式加入纹理坐标成分,并在顶点格式的描述中增加如D3DFVF_TEX1,表示顶点结构中包含了一对纹理坐标。
直到光栅化时,即该3D三角形已被变换至屏幕坐标系时,纹理映射才会进行。
2.创建并启用纹理
纹理数据通常从磁盘中读取,然后加载到IDirect3DTexutre9对象中,可以使用D3DX的如下函数完成纹理创建:
HRESULT D3DXCreateTextureFromFile(
__in LPDIRECT3DDEVICE9 pDevice,
__in LPCTSTR pSrcFile,
__out LPDIRECT3DTEXTURE9 *ppTexture
);
该函数可以加载的图片格式有:.bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, and .tga。
设置当前纹理可通过如下函数:
HRESULT IDirect3DDevice9::SetTexture (
[in] DWORD Sampler,
[in] IDirect3DBaseTexture9 *pTexture
);
在Direct3D中最多可以设置8层纹理,可以对这些纹理组合创建多重纹理。
3.纹理过滤器
纹理在被映射到屏幕空间时,通常,纹理三角形与屏幕三角形的大小并不一致。当纹理三角形比屏幕三角形小时,纹理三角形必须被放大。当纹理三角形比屏幕三角形大时,纹理三角形必须被缩小。在这两种情况下,都会有畸变发生,问了在一定程度上克服这种畸变,Direct3D采用纹理过滤技术。
Direct3D提供了三种类型的纹理过滤器:
a.最近采样点:默认过滤方式,速度最快,效果最差。
b.线性纹理过滤:效果较好,建议使用。
c.各向异性纹理过滤:效果最好,速度最慢,使用时需对D3DSAMP_MAXANISOTROPY 水平值进行设定,该值决定了各向异性过滤的质量水平。
4.多级渐进纹理
除了采用纹理过滤器技术外,还可以采用多级渐进纹理技术来消除屏幕三角形和纹理三角形的大小不同造成的影响。方法是:有某一级纹理创建一系列分辨率逐渐减少的纹理图像,并可对没中分辨率下的纹理所采用的过滤方式进行指定。设置方式如下:
HRESULT IDirect3DDevice9::SetSamplerState(
i,
D3DSAMP_MIPFILTER,
D3DTEXTUREFILTERTYPE
);
5.纹理寻址模式
Direct3D定义了6种用来处理纹理坐标值超出[0,1]区间的纹理映射模式:重复(WRAP)、钳位(CLAMP)、镜像(MIRROR)、边界(BORDER)、MIRRORONCE、FORCE_DWORD。