D3DXCompute TangentFrameEx 函数

对网格执行正切帧计算。 将生成切向量、二元向量和法线向量(可选)。 通过对边缘进行分组和拆分顶点,可以根据需要处理奇点。

语法

HRESULT D3DXComputeTangentFrameEx(
  _In_        ID3DXMesh   *pMesh,
  _In_        DWORD       dwTextureInSemantic,
  _In_        DWORD       dwTextureInIndex,
  _In_        DWORD       dwUPartialOutSemantic,
  _In_        DWORD       dwUPartialOutIndex,
  _In_        DWORD       dwVPartialOutSemantic,
  _In_        DWORD       dwVPartialOutIndex,
  _In_        DWORD       dwNormalOutSemantic,
  _In_        DWORD       dwNormalOutIndex,
  _In_        DWORD       dwOptions,
  _In_  const DWORD       *pdwAdjacency,
  _In_        FLOAT       fPartialEdgeThreshold,
  _In_        FLOAT       fSingularPointThreshold,
  _In_        FLOAT       fNormalEdgeThreshold,
  _Out_       ID3DXMesh   **ppMeshOut,
  _Out_       ID3DXBuffer **ppVertexMapping
);

parameters

pMesh [in]

类型: ID3DXMesh*

指向输入 ID3DXMesh 网格对象的指针。

dwTextureInSemantic [in]

类型: DWORD

指定纹理坐标输入语义。 如果D3DX_DEFAULT,该函数假定没有纹理坐标,除非指定了正常向量计算,否则函数将失败。

dwTextureInIndex [in]

类型: DWORD

如果网格具有多个纹理坐标,则 指定用于切线帧计算的纹理坐标。 如果为零,则网格只有一个纹理坐标。

dwUPartialOutSemantic [in]

类型: DWORD

指定类型(通常D3DDECLUSAGE_TANGENT)的输出语义,该类型描述相对于 U 纹理坐标的部分导数的存储位置。 如果D3DX_DEFAULT,则不会存储此部分派生。

dwUPartialOutIndex [in]

类型: DWORD

指定用于存储相对于 U 纹理坐标的部分导数的语义索引。

dwVPartialOutSemantic [in]

类型: DWORD

指定 D3DDECLUSAGE 类型,通常D3DDECLUSAGE_BINORMAL,用于描述相对于 V 纹理坐标的部分导数的存储位置。 如果D3DX_DEFAULT,则不会存储此部分派生。

dwVPartialOutIndex [in]

类型: DWORD

指定存储与 V 纹理坐标相关的部分导数的语义索引。

dwNormalOutSemantic [in]

类型: DWORD

指定输出法线语义(通常D3DDECLUSAGE_NORMAL),用于描述每个顶点的法向量的存储位置。 如果D3DX_DEFAULT,则不会存储此法向量。

dwNormalOutIndex [in]

类型: DWORD

指定将法向量存储在每个顶点处的语义索引。

dwOptions [in]

类型: DWORD

一个或多个指定正切帧计算选项的 D3DX TANGENT 标志的组合。 如果 为 NULL,则将指定以下选项:

说明 D3DX TANGENT 标志值
按角度(以弧度为单位)对法向量长度进行加权,由离开顶点的两条边进行子化。 & ! ( D3DXTANGENT_WEIGHT_BY_AREA |D3DXTANGENT_WEIGHT_EQUAL )
从纹理坐标 (u、v) 计算正交笛卡尔坐标。 请参阅“备注”。 & ! ( D3DXTANGENT_ORTHOGONALIZE_FROM_U |D3DXTANGENT_ORTHOGONALIZE_FROM_V )
纹理不采用 u 或 v 方向包装 & ! ( D3DXTANGENT_WRAP_UV )
与纹理坐标相关的部分导数已规范化。 & ! ( D3DXTANGENT_DONT_NORMALIZE_PARTIALS )
顶点按逆时针方向排列,围绕每个三角形。 & ! ( D3DXTANGENT_WIND_CW )
使用输入网格中已存在的每顶点法向量。 & ! ( D3DXTANGENT_CALCULATE_NORMALS )

 

如果未设置D3DXTANGENT_GENERATE_IN_PLACE,则克隆输入网格。 因此,原始网格必须有足够的空间来存储计算的法线向量和部分派生数据。

pdwAdjacency [in]

类型: const DWORD*

指向每个面三个 DWORD 数组的指针,该数组指定网格中每个人脸的三个邻居。 此数组中的字节数必须至少为 3 * GetNumFaces * size of (DWORD) 。

fPartialEdgeThreshold [in]

类型: FLOAT

指定两个部分导数相互不兼容的角度的最大余弦值。 如果相邻三角形中两个部分导数方向的点积小于或等于此阈值,则将拆分这些三角形之间共享的顶点。

fSingularPointThreshold [in]

类型: FLOAT

指定将顶点视为单数的部分导数的最大数量级。 由于多个三角形在具有附近正切帧的点上发生事件,但完全相互取消 ((如球体) 的顶部),部分导数的大小将减小。 如果数量级小于或等于此阈值,则将针对包含该阈值的每个三角形拆分顶点。

fNormalEdgeThreshold [in]

类型: FLOAT

与 fPartialEdgeThreshold 类似,指定两个法线之间的角度的最大余弦值,这是将拆分三角形之间共享的顶点的阈值。 如果两个法线的点积小于阈值,则会拆分共享顶点,在相邻的三角形之间形成硬边缘。 如果点积大于阈值,相邻三角形将内插其法线。

ppMeshOut [out]

类型: ID3DXMesh**

指向接收计算的正切、二元和法向量数据的输出 ID3DXMesh 网格对象的指针的地址。

ppVertexMapping [out]

类型: ID3DXBuffer**

指向输出 ID3DXBuffer 缓冲区对象的指针的地址,该对象接收此方法计算的新顶点到原始顶点的映射。 缓冲区是 DWORD 的数组,数组大小定义为 ppMeshOut 中的顶点数。

返回值

类型: HRESULT

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

备注

此函数的简化版本以 D3DXCompute TangentFrame 的形式提供。

每个顶点处计算的法线向量始终被规范化为具有单位长度。

计算正交笛卡尔坐标的最可靠解决方案是不设置标志D3DXTANGENT_ORTHOGONALIZE_FROM_U和D3DXTANGENT_ORTHOGONALIZE_FROM_V,以便正交坐标是从你和 v 的纹理坐标中计算的。 但是,在这种情况下,如果 u 或 v 为零,则该函数将分别使用 D3DXTANGENT_ORTHOGONALIZE_FROM_V 或 D3DXTANGENT_ORTHOGONALIZE_FROM_U 计算正交坐标。

要求

要求
标头
D3DX9Mesh.h

D3dx9.lib

另请参阅

网格函数

D3DXCompute TangentFrame