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個頂點的索引*******
這裡講的很詳細了
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不開源