從Xfile加載MESH模型
首先介紹ID3DXBuffer 接口
此類型有兩個方法
LPVOID ID3DXBuffer::GetBufferPointer();//返回指向緩存中數據起始位置的指針
DWORD ID3DXBuffer::GetBufferSize()//返回緩存的大小,單位為字節
下面函數用于創建一個空的ID3DXBuffer對象
HRESULT D3DXCreateBuffer(DWORD NumBytes, LPD3DBUFFER *ppBuffer);
再來介紹一個D3DXMATRIAL結構
typedef struct D3DXMATERIAL
{
D3DMATERIAL9 Mat3D; //存儲材質
LPSTR pTextureFilename;//存儲紋理路徑名
}D3DXMATERIAL;
再來看看一個重要的函數
HRESULT D3DXLoadMeshFromX(
LPCSTR pFilename,//文件名
DWORD Options,//創建網格時所使用的標記
LPDIRECT3DDEVICE9 *pDevice,
LPD3DXBUFFER *ppAdjacency,//鄰接表信息
LPD3DXBUFFER *ppMaterials,//材質和紋理信息. D3DXMATRIAL結構
LPD3DXBUFFER *ppEffectInstances,//
PDWORD pNumMaterials,//材質數目
LPD3DXMESH *ppMesh//返回填充好的Mesh對象
};
下面是一個實用的例子
class MyMesh
{
...........
private:
ID3DXMesh* Mesh = 0;
std::vector<D3DMATERIAL9> Mtrls(0);
std::vector<IDirect3DTexture9*> Textures(0);
......
};
bool MyMesh::LoadMyMesh( LPCSTR pName,IDirect3DDevice9* Device)
{
ID3DXBuffer* adjBuffer = 0;
ID3DXBuffer* mtrlBuffer = 0;
DWORD numMtrls = 0;
HRESULT hr = D3DXLoadMeshFromX(pName,D3DXMESH_MANAGED,Device,&adjBuffer,&mtrlBuffer,0,&numMtrls,&Mesh);
if(FAILED(hr))
{
::MessageBox(NULL,"D3DXLoadFromX() - FAILED",0,0);
return false;
}
if(mtrlBuffer!=0&&numMtrls!=0) //如果有材質
{
D3DXMATERIAL* mtrls =
(D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();//GetBufferPointer() 為了適合各種類型,因為返回VOID*類型 需要強制轉換
for(int i = 0;i<numMtrls;i++)
{
//得到的材質沒有環境光,我們得自己加上,讓它等于漫射光
mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
Mtrls.push_back(mtrls[i].MatD3D);
}
if(mtrls[i].pTextureFilename!=0)//紋理不為空
IDirect3DTexture9* tex = 0;
D3DXCreateTextureFromFile(Device,mtrls.pTextureFilename,&tex);
Textures.push_back(tex);
}
else
{
Textures.push_back(0);
}
}
adjBuffer->Release();
mtrlBuffer->Release();
return true;
}
//加載好后,設置好矩陣,就可以進行繪制了.由于Mesh是分為許多子集的,所以要一個一個渲染
void MyMesh::DrawMyMesh(IDreict3DDevice9* Deivice)
{
for(int i =0;i<Mtrls.size();i++)
{
Device->SetMaterial(&Mtrls[i]);
Device->SetTexture(0,Textures[i]);
Mesh->DrawSubset(i);
}
}
posted on 2009-04-18 10:02 麒麟子 閱讀(421) 評論(0) 編輯 收藏 引用 所屬分類: DirectX