Работа с 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 .
См. также