使用 D3DXMath

D3DXMath 是 Direct3D 应用程序的数学帮助程序库。 D3DXMath 由来已久,它包含在 D3DX 9 和 D3DX 10 中,也可以追溯到旧版本的 DirectX。

注意

D3DX 实用程序库(D3DX 9、D3DX 10 和 D3DX 11)在 Windows 8 中已被弃用,因此强烈建议迁移到 DirectXMath,而不是使用 D3DXMath。

 

DirectXMath 与 D3DXMath 拥有许多相同的功能,而 D3DXMath 在内部包含了许多针对特定处理器的优化。 主要区别在于 D3DXMath 托管在 D3DX9*.DLL 和 D3DX10*.DLL 中,而且很少有函数是内联的。 DirectXMath 库的调用约定明确支持 SIMD,而 D3DXMath 则必须执行负载和存储转换才能实现 SIMD 优化。

混合使用 DirectXMath 和 D3DXMath

D3DX11 不包含 D3DXMath,一般建议改为使用 DirectXMath。 但是,可以继续在应用程序中链接 D3DX9 和/或 D3DX10,这样就能继续使用 D3DXMath,或同时在应用程序中使用 D3DXMath 和 DirectXMath。

一般来说,将 XMVECTOR* 转换为使用 D3DXVECTOR4* 的函数或将 XMMATRIX* 转换为使用 D3DXMATRIX* 的函数是安全的。 但是,反向操作一般却并不安全,这是因为 XMVECTOR 和 XMMATRIX 必须 16 字节对齐,而 D3DXVECTOR4 和 D3DXMATRIX 则没有这样的要求。 不遵守此要求可能会导致运行时出现无效的对齐异常。

将 XMVECTOR* 转换为接收 D3DXVECTOR2* 或 D3DXVECTOR3* 的函数是安全的,但反之亦然。 对齐问题以及 D3DXVECTOR2 和 D3DXVECTOR3 是较小的结构这一事实,都会让这一操作变得不安全。

注意

D3DX(以及 D3DXMath)被认为是旧版,不能用于在 Windows 8 上运行的 Windows 商店应用,也未包含在桌面应用的 Windows 8 SDK 中。

 

将 DirectXMath 与 Direct3D 结合使用

在使用 Direct3D 时,DirectXMath 和 D3DXMath 都是可选的。 Direct3D 9 将 D3DMATRIX 和 D3DCOLOR 定义为 Direct3D API 的一部分,以支持固定函数管道(现已成为旧版)。 D3DX9 中的 D3DXMath 使用常见的图形数学运算扩展了这些 Direct3D 9 类型。 对于 Direct3D 10.x 和 Direct3D 11,API 仅使用可编程的管道,因此矩阵或颜色值都没有特定于 API 的结构。 当较新的 API 需要颜色值时,它们会使用浮点数值的显式数组或由 HLSL 着色器解释的常量数据的泛型缓冲区。 HLSL 本身可以支持行主矩阵格式或列主矩阵格式,因此布局完全取决于你(更多信息,请参阅 HLSL,矩阵排序;如果在着色器中使用列主矩阵格式,则需要在将 DirectXMath 矩阵数据放入常量缓冲区结构时对其进行转置)。 DirectXMath 和 D3DXMath 库虽然是可选的,但它们都提供与图形相关的常用功能,因此在进行 Direct3D 编程时非常方便。

将 XMVECTOR* 转换为 D3DVECTOR* 或将 XMMATRIX* 转换为 D3DMATRIX* 是安全的,因为 Direct3D 9 不会对传入的数据结构进行对齐假设。 将 XMCOLOR 转换为 D3DCOLOR 也是安全的。 可以通过 XMStoreColor() 将颜色的 4-float 表示转换为 XMCOLOR,从而获得与 D3DCOLOR 相当的 8:8:8:8 32 位 DWORD。

在使用 Direct3D 10.x 或 Direct3D 11 时,通常会使用 DirectXMath 类型为每个常量缓冲区构建一个结构,在这种情况下,这主要取决于你是否有能力控制对齐方式以提高效率,或使用 XMStore*() 操作将 XMVECTOR 和 XMMATRIX 数据转换为正确的数据类型。 在调用 Direct3D 10.x 或 Direct3D 11 API(需要颜色值的 float[4] 数组)时,可以使用包含颜色数据的 XMVECTOR* 或 XMFLOAT4*。

从 D3DXMath 移植

D3DXMath 类型 DirectXMath 等效项
D3DXFLOAT16 HALF
D3DXMATRIX XMFLOAT4X4
D3DXMATRIXA16 XMMATRIXXMFLOAT4X4A
D3DXQUATERNION
D3DXPLANE
D3DXCOLOR
XMVECTOR 使用的不是唯一类型,因此可能需要使用 XMFLOAT4 注意: **D3DXQUATERNION::operator *** 调用 D3DXQuaternionMultiply 函数,该函数用于两个四元数相乘。 但是,除非显式使用 XMQuaternionMultiply 函数,否则在四元数上使用 **XMVECTOR::operator *** 时将得到错误的答案。
D3DXVECTOR2 XMFLOAT2
D3DXVECTOR2_16F XMHALF2
D3DXVECTOR3 XMFLOAT3
D3DXVECTOR4 XMFLOAT4(或者,如果能保证数据是 16 字节对齐的,则为 XMVECTORXMFLOAT4A)。
D3DXVECTOR4_16F XMHALF4

 

注意

在 XNAMath 中没有与 D3DXVECTOR3_16F 直接等效的函数。

 

D3DXMath 宏 DirectXMath 等效项
D3DX_PI XM_PI
D3DX_1BYPI XM_1DIVPI
D3DXToRadian XMConvertToRadians
D3DXToDegree XMConvertToDegrees

 

D3DXMath 函数 DirectXMath 等效项
D3DXBoxBoundProbe BoundingBox::Intersects(XMVECTOR, XMVECTOR, float&)
D3DXComputeBoundingBox BoundingBox::CreateFromPoints
D3DXComputeBoundingSphere BoundingSphere::CreateFromPoints
D3DXSphereBoundProbe BoundingSphere::Intersects(XMVECTOR, XMVECTOR, float&)
D3DXIntersectTriFunction TriangleTests::Intersects
D3DXFloat32To16Array XMConvertFloatToHalfStream
D3DXFloat16To32Array XMConvertHalfToFloatStream
D3DXVec2Length XMVector2LengthXMVector2LengthEst
D3DXVec2LengthSq XMVector2LengthSq
D3DXVec2Dot XMVector2Dot
D3DXVec2CCW XMVector2Cross
D3DXVec2Add XMVectorAdd
D3DXVec2Subtract XMVectorSubtract
D3DXVec2Minimize XMVectorMin
D3DXVec2Maximize XMVectorMax
D3DXVec2Scale XMVectorScale
D3DXVec2Lerp XMVectorLerpXMVectorLerpV
D3DXVec2Normalize XMVector2NormalizeXMVector2NormalizeEst
D3DXVec2Hermite XMVectorHermiteXMVectorHermiteV
D3DXVec2CatmullRom XMVectorCatmullRomXMVectorCatmullRomV
D3DXVec2BaryCentric XMVectorBaryCentricXMVectorBaryCentricV
D3DXVec2Transform XMVector2Transform
D3DXVec2TransformCoord XMVector2TransformCoord
D3DXVec2TransformNormal XMVector2TransformNormal
D3DXVec2TransformArray XMVector2TransformStream
D3DXVec2TransformCoordArray XMVector2TransformCoordStream
D3DXVec2TransformNormalArray XMVector2TransformNormalStream
D3DXVec3Length XMVector3LengthXMVector3LengthEst
D3DXVec3LengthSq XMVector3LengthSq
D3DXVec3Dot XMVector3Dot
D3DXVec3Cross XMVector3Cross
D3DXVec3Add XMVectorAdd
D3DXVec3Subtract XMVectorSubtract
D3DXVec3Minimize XMVectorMin
D3DXVec3Maximize XMVectorMax
D3DXVec3Scale XMVectorScale
D3DXVec3Lerp XMVectorLerpXMVectorLerpV
D3DXVec3Normalize XMVector3NormalizeXMVector3NormalizeEst
D3DXVec3Hermite XMVectorHermiteXMVectorHermiteV
D3DXVec3CatmullRom XMVectorCatmullRomXMVectorCatmullRomV
D3DXVec3BaryCentric XMVectorBaryCentricXMVectorBaryCentricV
D3DXVec3Transform XMVector3Transform
D3DXVec3TransformCoord XMVector3TransformCoord
D3DXVec3TransformNormal XMVector3TransformNormal
D3DXVec3TransformArray XMVector3TransformStream
D3DXVec3TransformCoordArray XMVector3TransformCoordStream
D3DXVec3TransformNormalArray XMVector3TransformNormalStream
D3DXVec3Project XMVector3Project
D3DXVec3Unproject XMVector3Unproject
D3DXVec3ProjectArray XMVector3ProjectStream
D3DXVec3UnprojectArray XMVector3UnprojectStream
D3DXVec4Length XMVector4LengthXMVector4LengthEst
D3DXVec4LengthSq XMVector4LengthSq
D3DXVec4Dot XMVector4Dot
D3DXVec4Add XMVectorAdd
D3DXVec4Subtract XMVectorSubtract
D3DXVec4Minimize XMVectorMin
D3DXVec4Maximize XMVectorMax
D3DXVec4Scale XMVectorScale
D3DXVec4Lerp XMVectorLerpXMVectorLerpV
D3DXVec4Cross XMVector4Cross
D3DXVec4Normalize XMVector4NormalizeXMVector4NormalizeEst
D3DXVec4Hermite XMVectorHermiteXMVectorHermiteV
D3DXVec4CatmullRom XMVectorCatmullRomXMVectorCatmullRomV
D3DXVec4BaryCentric XMVectorBaryCentricXMVectorBaryCentricV
D3DXVec4Transform XMVector4Transform
D3DXVec4TransformArray XMVector4TransformStream
D3DXMatrixIdentity XMMatrixIdentity
D3DXMatrixDeterminant XMMatrixDeterminant
D3DXMatrixDecompose XMMatrixDecompose
D3DXMatrixTranspose XMMatrixTranspose
D3DXMatrixMultiply XMMatrixMultiply
D3DXMatrixMultiplyTranspose XMMatrixMultiplyTranspose
D3DXMatrixInverse XMMatrixInverse
D3DXMatrixScaling XMMatrixScaling
D3DXMatrixTranslation XMMatrixTranslation
D3DXMatrixRotationX XMMatrixRotationX
D3DXMatrixRotationY XMMatrixRotationY
D3DXMatrixRotationZ XMMatrixRotationZ
D3DXMatrixRotationAxis XMMatrixRotationAxis
D3DXMatrixRotationQuaternion XMMatrixRotationQuaternion
D3DXMatrixRotationYawPitchRoll XMMatrixRotationRollPitchYaw(注意参数顺序不同:D3DXMatrixRotationYawPitchRoll 需要偏航、俯仰和翻滚,XMMatrixRotationRollPitchYaw 需要俯仰、偏航和翻滚)
D3DXMatrixTransformation XMMatrixTransformation
D3DXMatrixTransformation2D XMMatrixTransformation2D
D3DXMatrixAffineTransformation XMMatrixAffineTransformation
D3DXMatrixAffineTransformation2D XMMatrixAffineTransformation2D
D3DXMatrixLookAtRH XMMatrixLookAtRH
D3DXMatrixLookAtLH XMMatrixLookAtLH
D3DXMatrixPerspectiveRH XMMatrixPerspectiveRH
D3DXMatrixPerspectiveLH XMMatrixPerspectiveLH
D3DXMatrixPerspectiveFovRH XMMatrixPerspectiveFovRH
D3DXMatrixPerspectiveFovLH XMMatrixPerspectiveFovLH
D3DXMatrixPerspectiveOffCenterRH XMMatrixPerspectiveOffCenterRH
D3DXMatrixPerspectiveOffCenterLH XMMatrixPerspectiveOffCenterLH
D3DXMatrixOrthoRH XMMatrixOrthographicRH
D3DXMatrixOrthoLH XMMatrixOrthographicLH
D3DXMatrixOrthoOffCenterRH XMMatrixOrthographicOffCenterRH
D3DXMatrixOrthoOffCenterLH XMMatrixOrthographicOffCenterLH
D3DXMatrixShadow XMMatrixShadow
D3DXMatrixReflect XMMatrixReflect
D3DXQuaternionLength XMQuaternionLength
D3DXQuaternionLengthSq XMQuaternionLengthSq
D3DXQuaternionDot XMQuaternionDot
D3DXQuaternionIdentity XMQuaternionIdentity
D3DXQuaternionIsIdentity XMQuaternionIsIdentity
D3DXQuaternionConjugate XMQuaternionConjugate
D3DXQuaternionToAxisAngle XMQuaternionToAxisAngle
D3DXQuaternionRotationMatrix XMQuaternionRotationMatrix
D3DXQuaternionRotationAxis XMQuaternionRotationAxis
D3DXQuaternionRotationYawPitchRoll XMQuaternionRotationRollPitchYaw(注意参数顺序不同: D3DXQuaternionRotationYawPitchRoll 需要偏航、俯仰和翻滚,XMQuaternionRotationRollPitchYaw 需要俯仰、偏航和翻滚)
D3DXQuaternionMultiply XMQuaternionMultiply
D3DXQuaternionNormalize XMQuaternionNormalizeXMQuaternionNormalizeEst
D3DXQuaternionInverse XMQuaternionInverse
D3DXQuaternionLn XMQuaternionLn
D3DXQuaternionExp XMQuaternionExp
D3DXQuaternionSlerp XMQuaternionSlerpXMQuaternionSlerpV
D3DXQuaternionSquad XMQuaternionSquadXMQuaternionSquadV
D3DXQuaternionSquadSetup XMQuaternionSquadSetup
D3DXQuaternionBaryCentric XMQuaternionBaryCentricXMQuaternionBaryCentricV
D3DXPlaneDot XMPlaneDot
D3DXPlaneDotCoord XMPlaneDotCoord
D3DXPlaneDotNormal XMPlaneDotNormal
D3DXPlaneScale XMVectorScale
D3DXPlaneNormalize XMPlaneNormalizeXMPlaneNormalizeEst
D3DXPlaneIntersectLine XMPlaneIntersectLine
D3DXPlaneFromPointNormal XMPlaneFromPointNormal
D3DXPlaneFromPoints XMPlaneFromPoints
D3DXPlaneTransform XMPlaneTransform
D3DXPlaneTransformArray XMPlaneTransformStream
D3DXColorNegative XMColorNegative
D3DXColorAdd XMVectorAdd
D3DXColorSubtract XMVectorSubtract
D3DXColorScale XMVectorScale
D3DXColorModulate XMColorModulate
D3DXColorLerp XMVectorLerpXMVectorLerpV
D3DXColorAdjustSaturation XMColorAdjustSaturation
D3DXColorAdjustContrast XMColorAdjustContrast
D3DXFresnelTerm XMFresnelTerm

 

注意

DirectXMath 的 Spherical Harmonics 函数可单独提供。 也可提供与 ID3DXMatrixStack 等效的 DirectXMath。

 

DirectXMath 编程指南