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 计算正交坐标。
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|
另请参阅