Поделиться через


Работа с 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, работающих в Windows 8 и не включенных в пакет SDK windows 8 для классических приложений.

 

Использование DirectXMath с Direct3D

DirectXMath и D3DXMath являются необязательными при работе с Direct3D. Direct3D 9 определяется D3DMATRIX и D3DCOLOR в рамках API Direct3D в поддержку конвейера фиксированной функции (в настоящее время устаревшая версия). D3DXMath в D3DX9 расширяет эти типы Direct3D 9 с общими математическими операциями графики. Для Direct3D 10.x и Direct3D 11 API использует только программируемый конвейер, поэтому для матриц или значений цвета не существует конкретной структуры API. Если для новых API требуется значение цвета, они принимают явный массив значений с плавающей запятой или универсальный буфер константных данных, интерпретируемых шейдером HLSL. HLSL может поддерживать форматы матрицы с основными строками или столбцами, поэтому макет полностью зависит от вас (дополнительные сведения см. в разделе HLSL, Matrix Ordering; если в шейдерах используются форматы матрицы с основными столбцами, необходимо транспонировать данные матрицы DirectXMath по мере его размещения в постоянных буферных структурах). Хотя это необязательно, библиотеки DirectXMath и D3DXMath предоставляют общие функции, связанные с графикой, и поэтому очень удобны при программировании Direct3D.

Приведение XMVECTOR* к D3DVECTOR* или XMMATRIX* в D3DMATRIX*, так как Direct3D 9 не делает предположений о структуре входящих данных. Это также безопасно приведение XMCOLOR к D3DCOLOR. Можно преобразовать 4-плавающее представление цвета в XMCOLOR с помощью XMStoreColor(), чтобы получить 8:8:8:8:8 32-разрядное DWORD, эквивалентное D3DCOLOR.

При работе с Direct3D 10.x или Direct3D 11 обычно используются типы DirectXMath для создания структуры для каждого буфера констант, и в этих случаях она в значительной степени зависит от способности управлять выравниванием, чтобы сделать эти эффективные или использовать операции XMStore*() для преобразования данных XMVECTOR и XMMATRIX в правильные типы данных. При вызове API Direct3D 10.x или Direct3D 11, требующих массива значений цвета float[4], можно привести XMVECTOR* или XMFLOAT4* с данными цвета.

Перенос из D3DXMath

Тип D3DXMath Эквивалент DirectXMath
D3DXFLOAT16 ПОЛОВИНА
D3DXMATRIX XMFLOAT4X4
D3DXMATRIXA16 XMMATRIX или XMFLOAT4X4A
D3DXQUATERNION
D3DXPLANE
D3DXCOLOR
XMVECTOR используется вместо уникальных типов, поэтому вам, скорее всего, потребуется использовать XMFLOAT4 Примечание: **D3DXQUATERNION::operator *** вызывает функцию D3DXQuaternionMultiply, которая умножает два кватерниона. Но если вы явно не используете функцию XMQuaternionMultiply , вы получите неправильный ответ при использовании **XMVECTOR::operator **** в кватернионе.
D3DXVECTOR2 XMFLOAT2
D3DXVECTOR2_16F XMHALF2
D3DXVECTOR3 XMFLOAT3
D3DXVECTOR4 XMFLOAT4(или если вы можете гарантировать, что данные выровнены по 16 байтам, XMVECTOR или XMFLOAT4A )
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 XMVector2Length или XMVector2LengthEst
D3DXVec2LengthSq XMVector2LengthSq
D3DXVec2Dot XMVector2Dot
D3DXVec2CCW XMVector2Cros
D3DXVec2Add XMVectorAdd
D3DXVec2Subtract XMVectorSubtract
D3DXVec2Minimize XMVectorMin
D3DXVec2Maximize XMVectorMax
D3DXVec2Scale XMVectorScale
D3DXVec2Lerp XMVectorLerp или XMVectorLerpV
D3DXVec2Normalize XMVector2Normalize или XMVector2NormalizeEst
D3DXVec2Hermite XMVectorHermite или XMVectorHermiteV
D3DXVec2CatmullRom XMVectorCatmullRom или XMVectorCatmullRomV
D3DXVec2BaryCentric XMVectorBaryCentric или XMVectorBaryCentricV
D3DXVec2Transform XMVector2Transform
D3DXVec2TransformCoord XMVector2TransformCoord
D3DXVec2TransformNormal XMVector2TransformNormal
D3DXVec2TransformArray XMVector2TransformStream
D3DXVec2TransformCoordArray XMVector2TransformCoordStream
D3DXVec2TransformNormalArray XMVector2TransformNormalStream
D3DXVec3Length XMVector3Length или XMVector3LengthEst
D3DXVec3LengthSq XMVector3LengthSq
D3DXVec3Dot XMVector3Dot
D3DXVec3Cross XMVector3Cross
D3DXVec3Add XMVectorAdd
D3DXVec3Subtract XMVectorSubtract
D3DXVec3Minimize XMVectorMin
D3DXVec3Maximize XMVectorMax
D3DXVec3Scale XMVectorScale
D3DXVec3Lerp XMVectorLerp или XMVectorLerpV
D3DXVec3Normalize XMVector3Normalize или XMVector3NormalizeEst
D3DXVec3Hermite XMVectorHermite или XMVectorHermiteV
D3DXVec3CatmullRom XMVectorCatmullRom или XMVectorCatmullRomV
D3DXVec3BaryCentric XMVectorBaryCentric или XMVectorBaryCentricV
D3DXVec3Transform XMVector3Transform
D3DXVec3TransformCoord XMVector3TransformCoord
D3DXVec3TransformNormal XMVector3TransformNormal
D3DXVec3TransformArray XMVector3TransformStream
D3DXVec3TransformCoordArray XMVector3TransformCoordStream
D3DXVec3TransformNormalArray XMVector3TransformNormalStream
D3DXVec3Project XMVector3Project
D3DXVec3Unproject XMVector3Unproject
D3DXVec3ProjectArray XMVector3ProjectStream
D3DXVec3UnprojectArray XMVector3UnprojectStream
D3DXVec4Length XMVector4Length или XMVector4LengthEst
D3DXVec4LengthSq XMVector4LengthSq
D3DXVec4Dot XMVector4Dot
D3DXVec4Add XMVectorAdd
D3DXVec4Subtract XMVectorSubtract
D3DXVec4Minimize XMVectorMin
D3DXVec4Maximize XMVectorMax
D3DXVec4Scale XMVectorScale
D3DXVec4Lerp XMVectorLerp или XMVectorLerpV
D3DXVec4Cross XMVector4Cros
D3DXVec4Normalize XMVector4Normalize или XMVector4NormalizeEst
D3DXVec4Hermite XMVectorHermite или XMVectorHermiteV
D3DXVec4CatmullRom XMVectorCatmullRom или XMVectorCatmullRomV
D3DXVec4BaryCentric XMVectorBaryCentric или XMVectorBaryCentricV
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 XMMatrixRotationRollPitchYitchYaw (Обратите внимание, что порядок параметров отличается: D3DXMatrixRotationYawPitchRoll принимает рывок, шаг, roll, XMMatrixRotationRollPitchYaw принимает поле, yaw, roll)
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 XMQuaternionNormalize или XMQuaternionNormalizeEst
D3DXQuaternionInverse XMQuaternionInverse
D3DXQuaternionLn XMQuaternionLn
D3DXQuaternionExp XMQuaternionExp
D3DXQuaternionSlerp XMQuaternionSlerp или XMQuaternionSlerpV
D3DXQuaternionSquaternionSquad XMQuaternionSquad или XMQuaternionSquadV
D3DXQuaternionSquadSetup XMQuaternionSquadSetup
D3DXQuaternionBaryCentric XMQuaternionBaryCentric или XMQuaternionBaryCentricV
D3DXPlaneDot XMPlaneDot
D3DXPlaneDotCoord XMPlaneDotCoord
D3DXPlaneDotNormal XMPlaneDotNormal
D3DXPlaneScale XMVectorScale
D3DXPlaneNormalize XMPlaneNormalize или XMPlaneNormalizeEst
D3DXPlaneIntersectLine XMPlaneIntersectLine
D3DXPlaneFromPointNormal XMPlaneFromPointNormal
D3DXPlaneFromPoints XMPlaneFromPoints
D3DXPlaneTransform XMPlaneTransform
D3DXPlaneTransformArray XMPlaneTransformStream
D3DXColorNegative XMColorNegative
D3DXColorAdd XMVectorAdd
D3DXColorSubtract XMVectorSubtract
D3DXColorScale XMVectorScale
D3DXColorModulate XMColorModulate
D3DXColorLerp XMVectorLerp или XMVectorLerpV
D3DXColorAdjustSaturation XMColorAdjustSaturation
D3DXColorAdjustContrast XMColorAdjustContrast
D3DXFresnelTerm XMFresnelTerm

 

Примечание.

Функции spherical Harmonics для DirectXMath доступны отдельно. Также доступен эквивалент DirectXMath id3DXMatrixStack .

 

Руководство по программированию DirectXMath