D3D加载纹理的步骤(1)

来源:互联网 发布:淘宝马切达工作室 编辑:程序博客网 时间:2024/06/06 00:45

当然加载之前你必须要做好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);

完毕。

 

0 0