借助纹理映射(texture mapping)
技术,可将图像数据映射
到三角形图元中,这种功能可以显著地增加所绘制场景的细节和真实感
纹理
是类似于表面的一个像素矩阵
,与表面不同的是它可被映射到三角形图元中
- 1、实现纹理的
映射
- 2、创建纹理
- 3、对纹理进行过滤,以创建一幅
较光滑的图像
1、纹理坐标
D3D所使用的纹理坐标系
由沿水平方向的u轴
和沿垂直方向的v轴
构成。用坐标对
标识的纹理元素称为纹理元(texel)
为了能够处理不同尺寸的纹理,D3D将纹理坐标做了规范化处理
,使之限定在0~1
之间
对于每个3D三角形图元,我们都可以在纹理中定义一个相应的三角形区域,然后将该三角形区域内的纹理映射到该3D三角形图元中,实际上纹理映射是发生在光栅化时,那时三角形图元已经变成了2D了
typedef struct Vertex{
float _x, _y, _z;
float _nx, _ny, _nz;
float _u, _v;
static const DWORD FVF;
}Vertex;
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
顶点结构中包含了一对纹理坐标
3D三角形图元的纹理三角形指定的很早,但直到光栅化时,即该3D三角形已被变换至屏幕坐标系时,纹理映射才会进行
2、创建并启用纹理
纹理数据通常从磁盘中的图像文件读入,然后加载到纹理对象中
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 *ppTexture
);
上述函数支持的纹理格式
:BMP、DDS、DIB、JPG、PNG、TGA
通过HRESULT IDirect3DDevice9::SetTexture
来设置当前纹理。与材质对比记忆
在固定功能的渲染管线中,最多可设置8层纹理
,可以对这些纹理进行组合以创建一幅更细致的图像。这称为多重纹理(multitexturing)
可以通过SetTexture函数禁用某一纹理层
3、纹理过滤器
也称为纹理采样
经过投影变换和视口变换
后,3D三角形图元被变换为屏幕上的2D三角形图元
。通常,纹理三角形与屏幕三角形
的大小并不一致,这就会涉及到放缩操作
,这时肯定会有畸变
发生。为了从某种程度上克服这类畸变
,D3D采用了纹理过滤(texture filtering)
技术
D3D提供了3种类型的纹理过滤方式
,每种过滤方式都提供一种质量水平(level of quality)
。质量越高,运算开销越大,处理速度越慢
3种不同的纹理过滤方式:
- 1、
最近点采样(nearest point sampling)
: - 2、
线性纹理过滤(linear filtering)
:推荐使用这种
- 3、
各向异性纹理过滤(anisotropic filtering)
:
在使用各向异性纹理过滤
时,我们必须对D3DSAMP_MAXANISOTROPIC水平值
进行设定,该值决定了各向异性过滤的质量水平。其他两种好像并没有要求指定质量水平值?????
以上设置都是通过d3ddev->SetSamplerState
函数来完成的
4、多级渐进纹理
多级渐进纹理链
和多级渐进纹理过滤器
如果硬件支持多级渐进纹理,那么其使用过程是自动的,至多只是需要设置一下多级渐进纹理过滤器
5、寻址模式
用来处理纹理坐标值超出0~1区间时如何进行纹理映射
- 1、
重复(wrap)
: - 2、
边界颜色(border color)
: - 3、
箝位(clamp)
: - 4、
镜像(mirror)
: