ID3DXMesh
接口基础
几何信息的获取
HRESULT
ID3DXMesh::GetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* ppVB);
HRESULT ID3DXMesh::GetIndexBuffer(LPDIRECT3DVERTEXBUFFER9*
ppVB);
例:
LPD3DXMESH Mesh;
IDirect3DvertexBuffer9* pVB = NULL;
IDirect3DvertexBuffer9* pIB = NULL;
Mesh-> GetVertexBuffer(&pVB);
Mesh-> GetVertexBuffer(&pIB);
填充顶点与索引缓冲
HRESULT ID3DXMesh::LockVertexBuffer(
DWORD Flags,
LPVOID* ppData
)
HRESULT ID3DXMesh::LockIndexBuffer(
DWORD Flags,
LPVOID* ppData
)
HRESULT ID3DXMesh::UnlockVertexBuffer();
HRESULT ID3DXMesh::UnlockIndexBuffer();
DWORD GetFVF() -------返回顶点的格式
DWORD GetNumVertices() --------返回顶点缓冲中的顶点数
DWORD GetNumBytesPerVertex() --------返回一个顶点所占的字节数
DWORD GetNumFaces() --------返回Mesh的面数,也就是三角形数
子集与属性缓冲
一个Mesh由数个子集组成,子集是Mesh中的一组使用相同属性渲染的三角形,这里
的属性指的是材质,纹理,渲染状态。每一个子集使用唯一的非负整数表示其ID;
获取属性缓冲
DWORD* buffer = NULL;
Mesh->LockAttributeBuffer(lockingFlags,&buffer);
Mesh->UnlockAttributeBuffer();
渲染
HRESULT DrawSubset(
DWORD AttribId
个图形
);
例:
1.
Mesh->DrawSubset(
0
);
2.
for
(int i =
0
;i<numSubsets;i++)
=================================================================
==============
DirectX
=================================================================
==============
ID3DXMesh
接口相关
优化Mesh
HRESULT OptimizeInplace(
DWORD Flags,
CONST
DWORD *pAdjacencyIn,
DWORD *pAdjacencyOut,
DWORD *pFaceRemap,
LPD3DXBUFFER *ppVertexRemap
);
参数Flags可取值以下一值或几种值的组合:
D3DXMESHOPT_COMPACT
D3DXMESHOPT_ATTRSORT
DrawSubset方法更有效的执行
D3DXMESHOPT_VERTEXCACHE
D3DXMESHOPT_STRIPREORDER
D3DXMESHOPT_IGNOREVERTS
注意: D3DXMESHOPT_VERTEXCACHE和D3DXMESHOPT_STRIPREORDER不能同时使用;
下面是对一个网格进行优化的片段
DWORD adjacencyInfo[Mesh->GetNumFaces()*
3
];
Mesh->GenerateAdjacency(
0.
0f,adjacencyInfo);
DWORD optimizedAdjacencyInfo[Mesh->GetNumFaces()*
3
];
Mesh->OptimizeInplace(
D3DXMESHOPT_ATTRSORT|
D3DXMESHOPT_COMPACT|
D3DXMESHOPT_VERTEXCACHE,
adjacencyInfo,
optimizedAdjacencyInfo,
0
,
0
);
还有一种方法是输出一个优化后的Mesh而不是在原来的基础上修改;
HRESULT Optimize(
DWORD Flags,
CONST
DWORD *pAdjacencyIn,
DWORD *pAdjacencyOut,
DWORD *pFaceRemap,
LPD3DXBUFFER *ppVertexRemap,
LPD3DXMESH *ppOptMesh
);
属性表
如果一个 MESH 使用 D3DXMESHOPT_ATTRSORT 进行优化,那么将创建一个
D3DXATTRIBUTERANGE结构的属性表数组:
typedef struct _D3DXATTRIBUTERANGE
D3DXATTRIBUTERANGE;
访问MESH的属性表
HRESULT GetAttributeTable(
D3DXATTRIBUTERANGE *pAttribTable,
DWORD *pAttribTableSize
);
此方法可以完成两个功能:返回属性表的属性数,返回完整的属性表
返回属性表的元素个数:
DWORD num =
0
;
Mesh->GetAttributeTable(
0
,&num);
数传NULL
然后就可以得到属性表了
D3DXATTRIBUTERANGE table = new D3DXATTRIBUTERANGE[num];
Mesh-> GetAttributeTable(table,&num);
还可以使用ID3DXMesh::SetAttribute Table方法直接修改属性表。
D3DXATTRIBUTERANGE attributeTable[
12
];
Mesh->SetAttributeTable(attributeTable,
12
);
=================================================================
==============
.X
应用..XX文件
1
.提取多边形网格信息:
HRESULT WINAPI D3DXLoadMeshFromX(
LPCTSTR pFilename,
DWORD Options,
LPDIRECT3DDEVICE9 pD3DDevice,
LPD3DXBUFFER *ppAdjacency,
LPD3DXBUFFER *ppMaterials,
LPD3DXBUFFER *ppEffectInstances,
DWORD *pNumMaterials,
LPD3DXMESH *ppMesh
);
下面函数片段从名为game
.
x的文件里读取3D模型:
if
(FAILED(D3DXLoadMeshFromX(L"game
.
x",
D3DXMESH_MANAGED,
g_pd3dDevice,
NULL,
&pD3DXMtrlBuffer,
NULL,
&g_dwNumMaterials,
集
&g_pMesh
) ) )
2.
ID3DXBuffer
接口:
GetBufferPointer();
GetBufferSize();
注意:ID3DXBuffer 指向的数据块本身是没有数据类型的,所以需要强制转换, 同时
ID3DXBuffer本身也是一个COM对象,所以使用完之后需要调用Release方法释放.
例如:
D3DXMATERIAL*d3dxMaterials= (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
pD3DXMtrlBuffer->Release();
3
.载入纹理和材质:
typedef struct D3DXMATERIAL
D3DXMATERIAL;
下面程序片断用于获取3D模型的材质和纹理信息:
D3DXMATERIAL*d3dxMaterials= (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials= newD3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures = newLPDIRECT3DTEXTURE9[g_dwNumMaterials];
注意:函数D3DXLoadMeshFromX调用成功后返回的是一个材质结构体数组,第i个材质信息
对应的第i个网格模型的子集,因此可以使用简单的循环来对整个网格进行渲染;
for
(DWORDi=
0
; i<g_dwNumMaterials;i++ )
}
pD3DXMtrlBuffer->Release();
4
.绘制网格模型
下面代码片断就是一个网格模型的渲染函数:
for
( DWORDi=
0
;i<g_dwNumMaterials;i++ )
=================================================================