纹理映射:
借助纹理映射texture mapping技术,我们可以将图像数据映射到三角形单元中.
纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单元.
一.纹理坐标
direct3d所使用的纹理坐标系由沿水平方向的u轴和垂直方向的y轴构成,(u,v)用uv标识的纹理元素称为纹理元
顶点结构:
struct Vertex
{
float _x,_y,_z;
flaot _nx, _ny, _nz;
float _u,_v;
static const DWORD FVF;
}
cont DWORD Vertex::FVF = D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1; // 包含一对纹理坐标
注意:
虽然我们为一个3d三角形指定了相应的纹理三角形,但直到光栅化时,即该3D三角形已被变换至屏幕坐标时,纹理映射才会进行
二.创建并启用纹理
纹理数据通常从磁盘中的图像文件读入,然后再加载到IDirect3DTexture9对象中
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 * ppTexture
);
该函数可以加载下列格式,BMP,DDS,DIB,JPG,PNG,TGA
设置当前纹理使用
HRESULT IDirect3DDevice9:: SetTexture(
D3DXHANDLE hParameter, //纹理层,当前使用的是0-7,八层纹理
LPDIRECT3DBASETEXTURE9 pTexture
);
标用某一纹理层
device->SetTexture(0,0)
三.纹理过滤器
纹理被映射到屏幕时空间中,通常纹理三角形的大小并不一致
当纹理三角形比屏幕三角形小时,为适应后者,纹理三角形必须被放大magnified
当纹理三角形比屏幕三角形大时,为适应后者,纹理三角形必须被缩小minifiled
在上述两种情形下,都有畸变发生,为了从某种程序上克服这类畸变,direct3d采用了一项称为纹理过滤的技术filtering
direct3d提供了3种类型的纹理过滤器fileter每种过滤器都提供了一种质量水平质量越高,运算开销越大,处理速度越慢
//设置取样器的值,主要是过过滤和多级渐进纹理使用
HRESULT SetSamplerState(
DWORD Sampler, //0
D3DSAMPLERSTATETYPE Type, //设置过滤器和多级渐进的对象
DWORD Value //设置的值
);
1.最近点采样nearest point samping:速度快质量差
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
2.线性纹理过滤器linear filtering :
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
3.各向异性纹理过滤anisotropic filtering
device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
如果设置为各向异性纹理要设置 其级别
device->SetSamplerState(0, D3DSAMP_MAXANISOTROPIC, 4);
四.多级渐进纹理
屏幕上的三角形通常与纹理三角形大小不一致,为了尽量消除由二者尺寸差异带来的影响,我们可为纹理创建一个多级渐进纹理链chain of mipmap
device->SetSamplerState(0, D3DSAMP_MIPFILTER, Filter)
Filter有以下值:
D3DTEXF_NONE禁用我级渐进纹理过滤器
D3DTEXF_POINT 选择尺寸与屏幕三角形最接近的那一级纹理
D3DTEXF_LINEAR将取与屏幕三角形尺寸最接近的两个纹理级
五.寻址模式
主要是处理纹理大于限制区间[0,1]的问题
direct3d定义了4种处理纹理坐标值超过[0,1]的纹理映射
1.重复寻址模式:
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
2.边界颜色寻址模式:
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0x000000ff);
3.箝位寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
4.镜像寻址模式
device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
代码: