directx初第九卷

纹理

纹理映射

声明变量

IDirect3DTexture9* texture = 0;

创建纹理贴图

//读取纹理图片(设备指针,纹理图片地址,把结果存到贴图指针)
D3DXCreateTextureFromFile(g_pd3dDevice, "UnityPlayerIcon.png", &texture);
//读取纹理图片(设备指针,纹理图片地址,使用贴图宽度,使用贴图高度,渐进纹理级数,标志,纹理格式,
//保存纹理方式,纹理过滤方式,生成纹理序列的过滤方式,替换alpha值的颜色值,通常为null,调色板地址,把结果存到贴图指针)
D3DXCreateTextureFromFileEx(g_pd3dDevice, "UnityPlayerIcon.png", 0, 0, 6, 0, D3DFMT_X8R8G8B8,
D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0xFF000000, 0, 0, &texture);

设置纹理贴图

//设置贴图(应用到纹理第一层,贴图指针)
g_pd3dDevice->SetTexture(0, texture);

纹理过滤

最近采样点纹理过滤

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);

线性纹理过滤

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

各向异性纹理过滤

//3为采样级数,越大越清晰
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 3);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

多级渐进纹理过滤

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
//2为采样级数,越大越模糊
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, 2);

纹理寻址

重复纹理寻址

g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);

镜像纹理寻址

g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);

夹取纹理寻址

g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

边框纹理寻址

g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_BORDER);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);

纹理寻址没有效果?

定义顶点缓存的uv

struct VERTEX
{
float _x, _y, _z;
float _u, _v; // 纹理坐标
VERTEX(float x, float y, float z, float u, float v) : _x(x), _y(y), _z(z), _u(u), _v(v) {}
};
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

填充

//(x,y,z,n*u,m*v) 其中n和m分别为u和v坐标的缩小倍数
v[0] = VERTEX(-1, 1, -1, 0.0f, 0.0f);
v[1] = VERTEX(1, 1, -1, 2.0f, 0.0f);
v[2] = VERTEX(1, -1, -1, 2.0f, 2.0f);
v[3] = VERTEX(-1, -1, -1, 0.0f, 2.0f);
。。。

文章目录
  1. 1. 纹理
    1. 1.1. 纹理映射
    2. 1.2. 纹理过滤
    3. 1.3. 纹理寻址
    4. 1.4. 纹理寻址没有效果?