DX 的.x 檔案

minggoddess發表於2013-12-26

template Header {
<3D82AB43-62DA-11cf-AB39-0020AF71E433>
WORD major;
WORD minor;
DWORD flags;
}

template Vector {
<3D82AB5E-62DA-11cf-AB39-0020AF71E433>
FLOAT x;
FLOAT y;
FLOAT z;
}

template Coords2d {
<F6F23F44-7686-11cf-8F52-0040333594A3>
FLOAT u;
FLOAT v;
}

.......

==================================================

Mesh Body1 {
303;                                         //下面點(r,g,b)的個數
0.000000;-0.061426;0.938846;,
-0.049693;0.200773;0.692165;,

.....

599;              //下面點的個數,奇怪的是為什麼這裡是599 不是303?難道是有些點vertice 沒有material
3;300,301,302;,
3;299,300,302;,
3;298,300,299;,

}

 

*******由於迷惑不解我就去查了一下,原來我完全理解錯了。303是頂點個數 599是面數。303下面的是頂點座標根本不是rgb

599下面是前面303個頂點的索引*******

http://wenku.baidu.com/link?url=CYKd7-nGeu3msat2AVXmHoWv5foNt7R4IdeBBGYEBzEVm71860wrzLPoi6YkNMFJQZ-azPaePsaRkHvahgnHOSJXy3fXZTybWEujMW3gLV_

這裡講的很詳細了

 

MeshMaterialList {
1;
1;
0;;
Material {
0.694118;0.694118;0.694118;1.000000;;//face color
50.000000;                //power
1.000000;1.000000;1.000000;;      //specular color
0.000000;0.000000;0.000000;;      //emissive color
TextureFilename {
"tiger.bmp";
}
}
}

 

MeshTextureCoords {
303;                              //下面點(u,v)的個數
0.190860;-0.544059;,
0.272086;-0.355992;,
0.077337;-0.522561;,

}

===========================================

開始是一堆型別定義

之後是一堆資料

mesh body 就是material 和 vertice 兩部分(我猜的)猜錯了。。。

mesh body是點和麵

MeshMaterialList是material

MeshTextureCoords就是頂點的uv座標了

 

我產生這種錯覺是因為

render mesh的時候的程式碼 看起來都沒有畫vertices的

VOID Render()
{
// Clear the backbuffer and the zbuffer
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );

// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Setup the world, view, and projection matrices
SetupMatrices();

// Meshes are divided into subsets, one for each material. Render them in
// a loop
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
// Set the material and texture for this subset
g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );

// Draw the mesh subset
g_pMesh->DrawSubset( i );
}

// End the scene
g_pd3dDevice->EndScene();
}

找來找去 既然setMaterial 和setTexture都是字面的意思

那就只能是DrawSubset做得了

跟進去看的時候 發現一個interface的實現

mesh material drawsubset什麼的都用到了這個方法

#define DECLARE_INTERFACE_(iface, baseiface)            interface DECLSPEC_NOVTABLE iface : public baseiface

 

DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;

 

#define STDMETHOD(method)        virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method

這樣寫讀起來還真麻煩,一堆巨集的縮寫。

翻譯過來其實就是

interface DECLSPEC_NOVTABLE ID3DXMesh :public ID3DxBaseMesh

{

virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE QueryInterface(THIS_ REFIID iid, LPVOID *ppv) PURE;

 

這個繼承實現的是interface的功能。。。。。除了翻譯這些裡面還有一堆巨集。。。。

 

總之g_pMesh->DrawSubset( i );這個句畫出了模型。。dx不開源

相關文章