菜鸟DirectX之纹理映射

纹理映射是什么

就是你用前面博客中讲到的方法绘制一个正方形后,在正方形上贴一张你想要显示的图片

纹理映射的使用

使用方法分为四步

1 在顶点格式中定义纹理的坐标

比如 

struct MyVertex

{

float x,y,z; //顶点位置

float u,v; //纹理坐标

}

2 填充顶点数据

CUSTOMVERTEX vertices[] =
{
{ 10.0f, 10.0f, 0.0f, 1.0f,  0,0
},
{ 10.0f, 210.0f, 0.0f, 1.0f,  1,0 }, 
{ 210.0f, 210.0f, 0.0f, 1.0f, 0.1},

{ 210.0f, 10.0f, 0.0f, 1.0f,  1.1 },
};

VOID* pVertices;
if( FAILED( g_pVertexBuffer->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
g_pVertexBuffer->Unlock();

3 创建纹理

函数 有三个

D3DXCreateTexture

D3DXCreateTextureFromFile

D3DXCreateTextureFromFileEx

4 设置纹理

函数

SetTexture

三 纹理的过滤方式

说白了 这货就是设置怎么在你的贴图上取出颜色值对应到你画出来的正方形的每个像素上

纹理过滤方式有四种

1 最近点采样

特点 速度快,易失真

使用方法

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

2 线性纹理过滤

特点 速度快 性价比高

使用方法

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

3 各向异性过滤

如果你的物体表面不是平面,比如有凹凸面,那就要设置这个

使用方法

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 2);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

4 多级渐进纹理过滤

这货最牛,效果最好,开销最大

设置这种过滤方式,DX会把你的贴图分成大小不一样的很多贴图,DX在纹理映射时会自动选择一张大小合适的贴图使用,比如物体离你近时就选 择一张大的贴图,离你远时就选择一张小的贴图。如果大小都不合适怎么办,那就对大小比较合适的两张贴图进行过滤,计算出最后的结果,过 滤方式就是前面那三种过滤方式中的一种

使用方法

这里把辅助过滤方式设为线性过滤

g_pd3dDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
g_pd3dDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL,
8);

纹理的寻址方式

纹理坐标的范围为(0,1),超过这个范围的咋办,设置纹理寻址方式呗。

简单说就是你在顶点格式中设置的纹理坐标超过了(0,1),比如你这么设置(0.0,2.0)

那从1.0到2.0的位置该贴啥图呢(准确的说是颜色值)

1 重复寻址模式

特点 超出的部分循环前面的纹理

使用方式

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

2 镜像寻址方式

特点 超出的部分自动复制并180度翻转前面的纹理

使用方式

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

3 夹取寻址模式

特点 超出的部分用拉伸前面纹理边缘的方式来解决

使用方式

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

4 边框颜色纹理寻址

特点 超出的部分使用前面纹理的边框颜色填充

使用方式

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

十点四十下班到的家,写完这篇博客快一点了,想对学弟学妹门说一句,如果你不是非常热爱游戏,就很难坚持下去的,珍爱生命,远离游戏,哈哈

你可能感兴趣的:(菜鸟DirectX之纹理映射)