DirectxMeshes
前面已經介紹過ID3DXMesh接口了, 但是只是簡單的用了D3DXCreate 來創建簡單的幾何體。這篇文章詳細地介紹ID3DXMesh接口。
1. Geometry Info
ID3DXMesh 是從ID3DXBaseMesh繼承下來的。ID3DXBaseMesh包含了vertex buffer 和 index buffer。通過這兩者的組合我們可以畫出任意三角形及任意三角形的組合。我們可以使用如下方式把vertex buffer 和 index buffer從ID3DXBaseMesh提取出來。
HRESULT ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* vertexBuf);
HRESULT ID3DXMesh::GeIndexBuffer(LPDIRECT3DindexBUFFER9* indexBuf);
ID3DXMesh 自己也定義了一套方法:
(1). GetFVF(): 返回頂點的FVF
(2). GetNumVertices(): 返回有多少個頂點。
(3). GetNumBytesPreVertex(): 返回每個頂點有多少字節
(4). GetNumFaces(): 返回有多少個三角形。
2. .x File
在3D圖形學中,網格是由一系列共面的多邊形組成。在Direct3D中, 提供了好幾個接口來處理網格,其中最常見的一個就是ID3DXMesh.我們可以使用該接口來裝載網格數據,獲得網格的各種信息.
一架飛機,一個花瓶,這樣的實體就叫做模型,而生成這種模型的過程叫建模。Direct3D利用.x文件來保存模型。
3. 顯示一個模型
顯示一個.x 文件,其實很簡單: 導入.x 文件, 得到.x文件中關于Material 和 Texture的信息, 然后利用這些信息渲染物體。
I: 首先聲明幾個渲染需要的變量:網格, 材質, 紋理
1 ID3DXMesh* Mesh = 0;
2 std::vector<D3DMATERIAL9> Mtrls(0);
3 std::vector<IDirect3DTexture9*> Textures(0);
II. 然后導入一個.x 文件。 可以利用D3DXLoadMeshFromX接口, 得到Mesh
1 HRESULT hr = 0;
2
3 // Load the XFile data.
4 ID3DXBuffer* adjBuffer = 0;
5 ID3DXBuffer* mtrlBuffer = 0;
6 DWORD numMtrls = 0;
7 hr = D3DXLoadMeshFromX(
8 _T("bigship1.x"),
9 D3DXMESH_MANAGED,
10 Device,
11 &adjBuffer,
12 &mtrlBuffer,
13 0,
14 &numMtrls,
15 &Mesh);
III: 利用上得出的東西, 設置好Material 和 Texture
1 if( mtrlBuffer != 0 && numMtrls != 0 )
2 {
3 D3DXMATERIAL* mtrls = (D3DXMATERIAL*)mtrlBuffer->GetBufferPointer();
4 for(int i = 0; i < numMtrls; i++)
5 {
6 // the MatD3D property doesn't have an ambient value set
7 // when its loaded, so set it now:
8 mtrls[i].MatD3D.Ambient = mtrls[i].MatD3D.Diffuse;
9 // save the ith material
10 Mtrls.push_back( mtrls[i].MatD3D );
11 // check if the ith material has an associative texture
12 if( mtrls[i].pTextureFilename != 0 )
13 {
14 // yes, load the texture for the ith subset
15 IDirect3DTexture9* tex = 0;
16 LPCWSTR lpTmp = 0;
17 lpTmp = ConvetASCIIToUnicode(mtrls[i].pTextureFilename);
18 D3DXCreateTextureFromFile(
19 Device,
20 lpTmp,
21 &tex);
22 // save the loaded texture
23 Textures.push_back( tex );
24 }
25 else
26 {
27 // no texture for the ith subset
28 Textures.push_back( 0 );
29 }
30 }
31
IIII: 設置好做不系,攝像頭,渲染參數等之后就可以顯示模型了
for(int i = 0; i < Mtrls.size(); i++)
{
Device->SetMaterial( &Mtrls[i] );
Device->SetTexture(0, Textures[i]);
Mesh->DrawSubset(i);
}
總結
以上是生活随笔為你收集整理的DirectxMeshes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android常见崩溃或闪退的问题描述及
- 下一篇: FXC Define的使用方法