DirectX9:基础篇 纹理

一.简介

纹理映射是一种为三角形赋予图像数据的技术

在 Direct3D 中一个纹理是通过 IDirect3DTexture9 接口来表示,一个纹理是一个像素矩阵的表面被映射到三角形上

二.纹理坐标

Direct3D 使用一个纹理坐标系统,它是由水平方向的 轴(向右为正)和竖直方向 v 轴(向下为正)构成

// 纹理坐标系统表示

struct Vertex

{

  float _x, _y, _z;

  float _nx, _ny, _nz;

  float _u, _v;

  static const DWORD FVF;
};

const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

三.创建纹理

1.D3DXCreateTextureFromFile()

纹理数据可以从存储在磁盘中的图片文件中读取,放入 IDirect3DTexture9 抽象纹理类型

支持的图片格式有: BMP DDS  DIB JPG  PNG  TGA

HRESULT D3DXCreateTextureFromFile(

  LPDIRECT3DDEVICE9 pDevice,

  LPCSTR pSrcFile,

  LPDIRECT3DTEXTURE9* ppTexture

);

HRESULT IDirect3DDevice9::SetTexture(

  DWORD Stage,

  IDirect3DBaseTexture9* pTexture

);

// 创建纹理
IDirect3Dtexture9* _stonewall;
D3DXCreateTextureFromFile(_device, "stonewall.bmp", &_stonewall);

// 设置纹理
Device->SetTexture(0, _stonewall);

四.过滤器

纹理被映射到屏幕中的三角形上,有可能纹理和三角形不一样大,当出现需要对纹理进行变形的时候,就要用过滤(Filtering)来让变形平滑的技术

Direct3D提供了三种不同的过滤器,每种的品质级别和速度各不相同

1.Nearest point sampling

默认的过滤方法,品质最差,速度最快

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);

4.Mipmaps过滤器

如果显卡支持Mipmaps,Direct3D会自动选择与三角形最匹配的Mipmap

Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);  // 不使用 mipmap
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

五.寻址模式

纹理坐标必须指定在[0, 1]之间

Direct3D的寻址模式有四种: 环绕纹理寻址模式 边框颜色纹理寻址模式  截取纹理寻址模式 镜像纹理寻址模式

1.环绕纹理寻址模式(wrap address mode)

if (::GetAsyncKeyState('W') & 0x8000f)
{
    Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
    Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);   
}

2.边框颜色纹理寻址模式(border color address mode)

if (::GetAsyncKeyState('B') & 0x8000f)
{
    Device>SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
    Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
    Device->SetSamplerState(0, D3DSAMP_BORDERCOLOR, 0x000000ff);
}

3.截取纹理寻址模式(clamp address mode)

if (::GetAsyncKeyState('C') & 0x8000f)
{
    Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
    Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
}

4.镜像纹理寻址模式(mirror address mode)

if (::GetAsyncKeyState('M') & 0x8000f)
{
    Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
    Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
}

六.例子

猜你喜欢

转载自www.cnblogs.com/k5bg/p/11126843.html