当然加载之前你必须要做好D3D的准备工作,这里就不说了。
D3D加载纹理的一般步骤:(下面以加载一张图片创建平面地图为例子)
(使用这种方法也可以加载一幅图片,原理:由2个三角形组成,让后贴你需要的图上去,这也是公告板技术的原理)
1.创建一个顶点缓冲区变量,用于保存顶点数据。
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // 顶点缓冲区
2.创建IDirect3DTexture9接口,用于保存纹理数据。
IDirect3DTexture9* map;
在后面步骤会说到会使用D3DXCreateTextureFromFile加载纹理,这里先给出一些认识。
该函数可以加载的格式有BMP、DDS、DIB、JPG、PNG,TGA,其他格式还没有试过,读者可以自己
试试其他格式能否。
该函数的原型是:
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice, // 设备指针
LPCSTR pSrcFile, // 加载图片的文件名
LPDIRECT3DTEXTURE9 *ppTexture // 代表纹理接口的指针
);
3.加载图片文件纹理,保存在map中
D3DXCreateTextureFromFile(g_pd3dDevice,_T(".\\bk.jpg"),&map);
4.给物体加上纹理坐标
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
int num =12; //顶点数
struct CUSTOMVERTEX
{
FLOAT x, y, z;//坐标
FLOAT fx,fy,fz;//法向量
FLOAT u,v;//贴图坐标
};
CUSTOMVERTEX g_map[]=
{
{ -50.0f,0.0f, -50.0f, 0.0f,0.5f,0.0f, 0.0f,18.0f},
{ 50.0f,0.0f, 50.0f, 0.0f,0.5f,0.0f, 18.0f,0.0f},
{ -50.0f,0.0f, 50.0f, 0.0f,0.5f,0.0f, 0.0f,0.0f},
{ -50.0f,0.0f, -50.0f, 0.0f,0.5f,0.0f, 0.0f,18.0f},
{ 50.0f,0.0f, -50.0f, 0.0f,0.5f,0.0f, 18.0f,18.0f},
{ 50.0f,0.0f, 50.0f, 0.0f,0.5f,0.0f, 18.0f,0.0f},
};
g_pd3dDevice->CreateVertexBuffer( num*3*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB,NULL) ;
5.顶点缓冲的锁定与解锁。
VOID* ppmap;
g_pVB->Lock( 0, sizeof(g_map), (void**)&ppmap, 0 ) ;//锁定顶点缓冲
memcpy( ppmap, g_map, sizeof(g_map) );//拷贝顶点值
g_pMB->Unlock();//解锁
6.设置当前要渲染的纹理。
g_pd3dDevice->SetTexture(0,map);
7..渲染顶点缓冲区
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0,2);
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,2);
其中: IDirect3DDevice9::DrawPrimitive
该方法用于渲染没有使用索引缓冲区的图元:
原型是:
HRESULT IDirect3DDevice9::DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);
例如下面的方法用于渲染3个三角形:
// 画3个三角形
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 3);
完毕。