D3DXWeldVertices 函数

将具有相等属性的复制顶点焊接在一起。 此方法使用指定的 epsilon 值进行相等性比较。

语法

HRESULT D3DXWeldVertices(
  _In_          LPD3DXMESH       pMesh,
  _In_          DWORD            Flags,
  _In_    const D3DXWeldEpsilons *pEpsilons,
  _In_    const DWORD            *pAdjacencyIn,
  _Inout_       DWORD            *pAdjacencyOut,
  _Out_         DWORD            *pFaceRemap,
  _Out_         LPD3DXBUFFER     *ppVertexRemap
);

参数

pMesh [in]

类型: LPD3DXMESH

指向 ID3DXMesh 对象的指针,该对象是用于焊接顶点的网格。

Flags [in]

类型: DWORD

D3DXWELDEPSILONSFLAGS 中的一个或多个标志的组合。

pEpsilons [in]

类型: const D3DXWeldEpsilons*

指向 D3DXWeldEpsilons 结构的指针,指定要用于此方法的 epsilon 值。 使用 NULL 将所有结构成员初始化为默认值 1.0e-6f。

pAdjacencyIn [in]

类型: const DWORD*

指向每个人脸三个 DWORD 的数组的指针,该数组为源网格中的每个人脸指定三个邻居。 如果边缘没有相邻面,则值为0xffffffff。 如果此参数设置为 NULL,将调用 ID3DXBaseMesh::GenerateAdjacency 来创建逻辑邻接信息。

pAdjacencyOut [in, out]

类型: DWORD*

指向每个人脸三个 DWORD 的数组的指针,该数组为优化网格中的每个人脸指定三个邻居。 如果边缘没有相邻面,则值为0xffffffff。

pFaceRemap [out]

类型: DWORD*

一个 DWORD 数组,每个面一个,用于标识与焊接网格中的每个面对应的原始网格面。

ppVertexRemap [out]

类型: LPD3DXBUFFER*

指向 ID3DXBuffer 接口的指针的地址,该接口包含每个顶点的 DWORD,该顶点指定新顶点如何映射到旧顶点。 如果需要根据新的顶点映射更改外部数据,此重新映射非常有用。

返回值

类型: HRESULT

如果函数成功,则返回值D3D_OK。 如果函数失败,则返回值可以是以下值之一:D3DERR_INVALIDCALL、E_OUTOFMEMORY。

备注

此函数使用提供的相邻信息来确定复制的点。 顶点基于 epsilon 比较进行合并。 位置相等的顶点必须已由点代表数据计算和表示。

此函数合并了逻辑焊接的顶点,这些顶点具有类似的组件,例如 pEpsilons 中的法线或纹理坐标。

以下示例代码在启用焊接的情况下调用此函数。 使用法向量和顶点位置的 epsilon 值比较顶点。 指针返回到人脸重新映射数组 (pFaceRemap) 。

TCHAR            strMediaPath[512];       // X-file path 
LPD3DXBUFFER     pAdjacencyBuffer = NULL; // adjacency data buffer
LPD3DXBUFFER     pD3DXMtrlBuffer  = NULL; // material buffer
LPD3DXMESH       pMesh            = NULL; // mesh object
DWORD            m_dwNumMaterials;        // number of materials
D3DXWELDEPSILONS Epsilons;                // structure with epsilon values
DWORD            *pFaceRemap[65536];      // face remapping array
DWORD            i;                       // internal variable
    
    // Load the mesh from the specified file
    hr = D3DXLoadMeshFromX ( strMediaPath,
                         D3DXMESH_MANAGED,
                         m_pd3dDevice,
                         &pAdjacencyBuffer,
                         &pD3DXMtrlBuffer,
                         NULL,
                         &m_dwNumMaterials,
                         &pMesh ) )
                             
    if( FAILED( hr ) ) 
      goto End;              // Go to error handling
    
    // Set epsilon values
    Epsilons.Normal = 0.001;
    Epsilons.Position = 0.1;
    
    // Weld the vertices
    for( i=0; i < 65536; i++ )
    { 
        pFaceRemap[i] = 0; 
    }
    
    hr = D3DXWeldVertices ( pMesh,
                            D3DXWELDEPSILONS_WELDPARTIALMATCHES,
                            &Epsilons,
                            (DWORD*)pAdjacencyBuffer->GetBufferPointer(),
                            (DWORD*)pAdjacencyBuffer->GetBufferPointer(),
                            (DWORD*)pFaceRemap,
                            NULL )
                            
    if( FAILED( hr ) ) 
      goto End;              // Go to error handling

要求

要求
标头
D3DX9Mesh.h

D3dx9.lib

另请参阅

网格函数