zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ListView与ArrayAdapter(二)
    ListView与SimpleAdapter(三)
    对于ListView的一些用法(一)
    如何使用AsyncTask
    you must restart adb and eclipse的相关解决办法
    leetcode 移动零 JAVA
    leetcode 有效的字母异位词 java
    leetcode 单词拆分 II java
    leetcode 分割回文串 java
    leetcode 验证回文串 java
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/1728348.html
Copyright © 2011-2022 走看看