DirectX 90 3D 网格二

网格二

 

ID3DXBuffer

ID3DXBuffer接口是一种泛型数据结构 该接口有两个方法

· LPVOID GetBufferPointer() ; 返回指向缓存中数据起始位置的指针

· DWORD GetBufferSize(); 返回缓存的大小,单位为字节。

    为了保持该接口的通用性, 该接口使用了void类型指针,这就意味着必须由我们来实现被存储的数据类型。例如:D3DXLoadMeshFromX函数用ID3DXBuffer 类型的指针返回一个网格对象的邻接信息。由于邻接信息被 存储在一个DWORD类型的数组中,所以当我们想要使用该接口的邻接信息时。我们必须对缓存进行强制类型转换。

例:

DWORD *info = (DWORD*)adjacencyInfo->GetBufferPointer();

D3DXMATERIAL *mtrls = (D3DXMTRIAL*) mtrlBuffer->GetBufferPointer();

 

用完之后 要释放:

adjacencyInfo->Release();

mtrlBuffer->Release();

 

创建一个空的ID3DXBuffer对象

HRESULT D3DXCreateBuffer(

         DWORD  NumBytes,         //Size of the Buffer

         LPD3DXBUFFER *ppBuffer    //Returns the created buffer

);

 

 

加载XFile 文件

使用D3DXLoadMeshFromX加载网格数据并其在XFile文件中 

HRESULT D3DXLoadMeshFromX(   

    LPCTSTR pFilename,

    DWORD Options,

    LPDIRECT3DDEVICE9 pDevice,

    LPD3DXBUFFER* ppAdjacency,

    LPD3DXBUFFER* ppMaterials,

    LPD3DXBUFFER* ppEffectInstances,

    DWORD* pNumMaterials,

    LPD3DXMESH* ppMesh

);

说明一下:

·pFileName 所在加载的XFile文件名。

·Options 创建网格进所使用的创建标记。

         ·D3DXMESH_32BIT  网格将使用32位索引。

         ·D3DXMESH_MANAGED 网格数据将被存储于托管池中

         ·D3DXMESH_WRITEONLY 指定网格为只读

         ·D3DMXESH_DYNAMIC 网格缓存将使用动态内存

·pDevice 与该网格对象相关的设备指针。

·ppAdjacency 返回一个ID3DBuffer 对象,该对象包含了一个描述了该网格对象的邻接信息的DWORD类型的数组。

·ppMaterials 返回一个ID3DXBuffercf对象,该对象包含了一个存储了该网格材质数据的D3DXMATERIAL类型的结构数组。

·ppEffectInstances 返回一个ID3DXBuffer对象, 

包含一个D3DXEFFECTINSTANCE结构。指定为0忽略。

·pNumMaterials  返回网格中的材质数目(即

·ppMesh 返回所他创建的并已填充了XFile几何数据的ID3DXMesh对象。

 

XFile材质

D3DXLoadMeshFronX函数中第5个参数返回了一个存储了材质数据的

D3DXMATRIAL类型的结构数组。D3DXMATRIAL定义如下:

typedef struct D3DXMATRIAL{

        D3DMATERIAL9 MatD3D;

        LPSTR pTextureFilename;

} D3DXMATERIAL;

 

LPSTR pTextureFilename 指向以NULL结尾的字符串的指针, 该字符串指定了与网格相关的纹理文件名。XFile文件中并未存储纹理数据, 它只包含了纹理图像文件名。该文件名是对包含了实际纹理数据的纹理图像的引用。当用D3DXLoadMeshFromX 函数加载了一个XFile文件后,我们必须根据指定的纹理文件名加载纹理数据。

 

生成顶点法线

XFile 文件中有可能没有存放顶点的法向量。为了使用光照,我们可能需要手工计算每个顶点的法向量。

HRESULT D3DXComputNormals(

     LPD3DXBASEMESH  pMesh,  //Mesh to compute the normals of,

     CONST DWORD *pAdjacency    //Input adjacency info

);

 

如果一个XFile文件不含顶点法线数据,则由函数D3DXLoadMeshFromX所创建的ID3DXMesh网格对象在其顶点格式中的将不含D3DFVF_NORMAL标记。所以,在使函数D3DXComputeNormals之前,我们必须克隆该网格,并为其指定一个包含了D3DFVF_NORMAL标记的顶点格式。

 

ID3DXPMesh接口方法

ID3DXPMesh接口继承自ID3DXBaseMesh 接口。

DWORD GetMaxFaces(VOID);   //返回渐进网格面片数可被指定的上限

DWORD GetMaxVertices(VOID);  //返回渐进网格顶点数据可被指定的上限

DWORD GetMinFaces(VOID);   //返回渐进网格面片数可被指定的下限

DWORD GetMinVertices(VOID);  //返回渐进顶点数可被指定的下限

HRESULT SetNumFaces(DWORD Faces);//设置网格的面片数被简化或细化到//的个数。

HRESULT SetNunVertices(DWORD Vertices);// 设置网格的顶点数可被简化或细//化的个数。

HRESULT TrimByFaces (

DWORD NewFacesMin, 

DWORD NewFacesMax,

DWORD *rgiFaceRemap,  //Face remap info

DWORD *rgiVertRemap,   //Vertex remap info

); 

//重新设定面片数据的最小值(NewFacesMin)和最大值(NewFaceMax)。

//NewFacesMin 和NewFacesMax 必须位于[GetMinFaces(), GetMaxFaces()]内。

 

HRESULT TrimByVertices (

DWORD NewVerticesMin, 

DWORD NewVerticesMax,

DWORD *rgiFaceRemap,  //Face remap info

DWORD *rgiVertRemap,   //Vertex remap info

); 

// 重新设定顶点数的最小值(NewVerticesMin)和最大值(NewVerticesMax)。

// NewVerticesMin 和NewVerticesMax 必须位于区间[GetMinVertices (),

//GetMaxVertices ()]

 

江西理工大学 Fangshenghui2010-5-5

原文地址:https://www.cnblogs.com/fangshenghui/p/1728348.html