DX 的.x 文件

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不开源

原文地址:https://www.cnblogs.com/minggoddess/p/3492677.html