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
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|
另请参阅