direct9.0纹理映射

来源:互联网 发布:财务记账软件 免费 编辑:程序博客网 时间:2024/05/22 08:03

纹理映射:


借助纹理映射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);

 

 

代码:

http://download.csdn.net/source/1888403

原创粉丝点击