Arbeta med D3DXMath
D3DXMath är ett matematiskt hjälpbibliotek för Direct3D-program. D3DXMath är långvarigt, ingår i D3DX 9 och D3DX 10 och går tillbaka till äldre versioner av DirectX också.
Anteckning
D3DX-verktygsbiblioteket (D3DX 9, D3DX 10 och D3DX 11) är inaktuellt för Windows 8, så vi rekommenderar starkt att du migrerar till DirectXMath i stället för att använda D3DXMath.
DirectXMath delar mycket av samma funktioner i D3DXMath, och internt innehåller D3DXMath ett antal processorspecifika optimeringar. Den viktigaste skillnaden är att D3DXMath finns i D3DX9*. DLL:er och D3DX10*. DLL:er och mycket få av funktionerna är inlindade. Anropskonventionen för DirectXMath-biblioteket är uttryckligen SIMD-vänlig, medan D3DXMath måste utföra belastnings- och lagringskonverteringar för att implementera SIMD-optimering.
D3DX11 innehåller inte D3DXMath, och i allmänhet rekommenderar vi att du använder DirectXMath i stället. Du kan dock fortsätta att länka till D3DX9 och/eller D3DX10 i ditt program, och därför kan du fortsätta att använda D3DXMath eller använda både D3DXMath och DirectXMath i ditt program samtidigt.
Det är i allmänhet säkert att kasta en XMVECTOR* till en funktion som tar D3DXVECTOR4* eller att kasta en XMMATRIX* till en funktion som tar D3DXMATRIX*. Inversen är dock generellt sett inte säker eftersom XMVECTOR och XMMATRIX behöver justeras till 16 byte, medan D3DXVECTOR4 och D3DXMATRIX inte har något sådant krav. Om du inte följer det här kravet kan det leda till ogiltiga justeringsundantag vid körning.
Det är säkert att omvandla en XMVECTOR* till en funktion som tar D3DXVECTOR2* eller D3DXVECTOR3*, men inte tvärtom. Både anpassningsproblem och det faktum att D3DXVECTOR2 och D3DXVECTOR3 är mindre strukturer gör detta till en osäker åtgärd.
Anteckning
D3DX (och därmed D3DXMath) anses vara äldre och är inte tillgängligt för Windows Store-appar som körs på Windows 8 och som inte ingår i Windows 8 SDK för skrivbordsappar.
Både DirectXMath och D3DXMath är valfria när du arbetar med Direct3D. Direct3D 9 definierade D3DMATRIX och D3DCOLOR som en del av Direct3D-API:et till stöd för (nu äldre) pipelinen för fast funktion. D3DXMath i D3DX9 utökar dessa Direct3D 9-typer med vanliga grafikmatematikåtgärder. För Direct3D 10.x och Direct3D 11 använder API:et endast den programmerbara pipelinen så det finns ingen API-specifik struktur för antingen matriser eller färgvärden. När de nyare API:erna kräver ett färgvärde tar de en explicit matris med flyttalvärden eller en allmän buffert med konstanta data som tolkas av HLSL-skuggningen. Själva HLSL kan ha stöd för matrisformat med radhuvud- eller kolumnhuvudnamn, så layouten är helt upp till dig (mer information finns i HLSL, Matrisordning; om du använder kolumnmatrisformat i skuggorna måste du transponera DirectXMath-matrisdata när du placerar dem i dina konstanta buffertstrukturer). Även om det är valfritt tillhandahåller DirectXMath- och D3DXMath-biblioteken både vanliga grafikrelaterade funktioner och är därför mycket praktiska när du gör Direct3D-programmering.
Det är säkert att omvandla en XMVECTOR* till en D3DVECTOR* eller XMMATRIX* till D3DMATRIX* eftersom Direct3D 9 inte gör några anpassningsantaganden om den inkommande datastrukturen. Det är också säkert att kasta XMCOLOR till D3DCOLOR. Du kan konvertera en 4-flyts representation av färg till XMCOLOR via XMStoreColor() för att få 8:8:8:8 32-bitars DWORD som är ekvivalent med D3DCOLOR.
När du arbetar med Direct3D 10.x eller Direct3D 11 använder du vanligtvis DirectXMath-typer för att skapa en struktur för var och en av dina konstanta buffertar, och i dessa fall beror det till stor del på din förmåga att kontrollera justeringen för att göra dessa effektiva, eller för att använda XMStore*()-åtgärder för att konvertera XMVECTOR- och XMMATRIX-data till rätt datatyper. När du anropar Direct3D 10.x- eller Direct3D 11-API:er som kräver en flyttal[4] matris med färgvärden kan du omvandla en XMVECTOR* eller XMFLOAT4* som innehåller färgdata.
D3DXMath-typ | DirectXMath-motsvarighet |
---|---|
D3DXFLOAT16 | HALV |
D3DXMATRIX | XMFLOAT4X4 |
D3DXMATRIXA16 | XMMATRIX- eller XMFLOAT4X4A |
D3DXQUATERNION D3DXPLANE D3DXCOLOR |
XMVECTOR- används istället för att ha unika typer, så du kommer troligtvis behöva använda en XMFLOAT4-Obs!**D3DXQUATERNION::operator *** anropar funktionen D3DXQuaternionMultiply, som multiplicerar två kvaternioner. Men om du inte uttryckligen använder funktionen XMQuaternionMultiply får du ett felaktigt svar när du använder **XMVECTOR::operator *** på en quaternion. |
D3DXVECTOR2 | XMFLOAT2 |
D3DXVECTOR2_16F | XMHALF2 |
D3DXVECTOR3 | XMFLOAT3 |
D3DXVECTOR4 |
XMFLOAT4(eller om du kan garantera att data är 16-byte justerade, XMVECTOR eller XMFLOAT4A ) |
D3DXVECTOR4_16F | XMHALF4 |
Anteckning
Det finns ingen direkt motsvarighet till D3DXVECTOR3_16F i XNAMath.
D3DXMath-makro | DirectXMath-motsvarighet |
---|---|
D3DX_PI | XM_PI |
D3DX_1BYPI | XM_1DIVPI |
D3DXToRadian | XMConvertToRadians |
D3DXToDegree | XMConvertToDegrees |
D3DXMath-funktion | DirectXMath-motsvarighet |
---|---|
D3DXBoxBoundProbe | BoundingBox::Intersects(XMVECTOR, XMVECTOR, float&) |
D3DXComputeBoundingBox | BoundingBox::CreateFromPoints |
D3DXComputeBoundingSphere | BoundingSphere::CreateFromPoints |
D3DXSphereBoundProbe | BoundingSphere::Intersects(XMVECTOR, XMVECTOR, float&) |
D3DXIntersectTriFunction | TriangelTest::Skär |
D3DXFloat32To16Array | XMConvertFloatToHalfStream |
D3DXFloat16To32Array | XMConvertHalfToFloatStream |
D3DXVec2Length | XMVector2Length eller XMVector2LengthEst |
D3DXVec2LengthSq | XMVector2LengthSq |
D3DXVec2Dot | XMVector2Dot |
D3DXVec2CCW | XMVector2Cross |
D3DXVec2Lägg till | XMVectorLägg till |
D3DXVec2Subtract | XMVectorSubtract |
D3DXVec2Minimize | XMVectorMin |
D3DXVec2Maximize | XMVectorMax |
D3DXVec2Scale | XMVectorScale |
D3DXVec2Lerp | XMVectorLerp eller XMVectorLerpV |
D3DXVec2Normalize | XMVector2Normalize eller XMVector2NormalizeEst |
D3DXVec2Hermite | XMVectorHermite eller XMVectorHermiteV |
D3DXVec2CatmullRom | XMVectorCatmullRom eller XMVectorCatmullRomV |
D3DXVec2BaryCentric | XMVectorBaryCentric eller XMVectorBaryCentricV |
D3DXVec2Transform | XMVector2Transform |
D3DXVec2TransformCoord | XMVector2TransformCoord |
D3DXVec2TransformNormal | XMVector2TransformNormal |
D3DXVec2TransformArray | XMVector2TransformStream |
D3DXVec2TransformCoordArray | XMVector2TransformCoordStream |
D3DXVec2TransformNormalArray | XMVector2TransformNormalStream |
D3DXVec3Length | XMVector3Length eller XMVector3LengthEst |
D3DXVec3LengthSq | XMVector3LengthSq |
D3DXVec3Dot | XMVector3Dot |
D3DXVec3Cross | XMVector3Cross |
D3DXVec3Lägg till | XMVectorLägg till |
D3DXVec3Subtract | XMVectorSubtract |
D3DXVec3Minimize | XMVectorMin |
D3DXVec3Maximize | XMVectorMax |
D3DXVec3Scale | XMVectorScale |
D3DXVec3Lerp | XMVectorLerp eller XMVectorLerpV |
D3DXVec3Normalize | XMVector3Normalize eller XMVector3NormalizeEst |
D3DXVec3Hermite | XMVectorHermite eller XMVectorHermiteV |
D3DXVec3CatmullRom | XMVectorCatmullRom eller XMVectorCatmullRomV |
D3DXVec3BaryCentric | XMVectorBaryCentric eller XMVectorBaryCentricV |
D3DXVec3Transform | XMVector3Transform |
D3DXVec3TransformCoord | XMVector3TransformCoord |
D3DXVec3TransformNormal | XMVector3TransformNormal |
D3DXVec3TransformArray | XMVector3TransformStream |
D3DXVec3TransformCoordArray | XMVector3TransformCoordStream |
D3DXVec3TransformNormalArray | XMVector3TransformNormalStream |
D3DXVec3Project | XMVector3Project |
D3DXVec3Unproject | XMVector3Unproject |
D3DXVec3ProjectArray | XMVector3ProjectStream |
D3DXVec3UnprojectArray | XMVector3UnprojectStream |
D3DXVec4Length | XMVector4Length eller XMVector4LengthEst |
D3DXVec4LengthSq | XMVector4LengthSq |
D3DXVec4Dot | XMVector4Dot |
D3DXVec4Lägg till | XMVectorLägg till |
D3DXVec4Subtract | XMVectorSubtract |
D3DXVec4Minimize | XMVectorMin |
D3DXVec4Maximize | XMVectorMax |
D3DXVec4Scale | XMVectorScale |
D3DXVec4Lerp | XMVectorLerp eller XMVectorLerpV |
D3DXVec4Cross | XMVector4Cross |
D3DXVec4Normalize | XMVector4Normalize eller XMVector4NormalizeEst |
D3DXVec4Hermite | XMVectorHermite eller XMVectorHermiteV |
D3DXVec4CatmullRom | XMVectorCatmullRom eller XMVectorCatmullRomV |
D3DXVec4BaryCentric | XMVectorBaryCentric eller 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 | XMMatrixRotationRollPitchYaw (Observera att ordningen på parametrarna skiljer sig: D3DXMatrixRotationYawPitchRoll tar yaw, pitch, roll, medan XMMatrixRotationRollPitchYaw tar pitch, 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 (Observera att ordningen på parametrarna skiljer sig: D3DXQuaternionRotationYawPitchRoll tar yaw, pitch, roll, XMQuaternionRotationRollPitchYaw tar pitch, yaw, roll) |
D3DXQuaternionMultiply | XMQuaternionMultiply |
D3DXQuaternionNormalize | XMQuaternionNormalize eller XMQuaternionNormalizeEst |
D3DXQuaternionInverse | XMQuaternionInverse |
D3DXQuaternionLn | XMQuaternionLn |
D3DXQuaternionExp | XMQuaternionExp |
D3DXQuaternionSlerp | XMQuaternionSlerp eller XMQuaternionSlerpV |
D3DXQuaternionSquad | XMQuaternionSquad eller XMQuaternionSquadV |
D3DXQuaternionSquadSetup | XMQuaternionSquadSetup |
D3DXQuaternionBaryCentric | XMQuaternionBaryCentric eller XMQuaternionBaryCentricV |
D3DXPlaneDot | XMPlaneDot |
D3DXPlaneDotCoord | XMPlaneDotCoord |
D3DXPlaneDotNormal | XMPlaneDotNormal |
D3DXPlaneScale | XMVectorScale |
D3DXPlaneNormalize | XMPlaneNormalize eller XMPlaneNormalizeEst |
D3DXPlaneIntersectLine | XMPlaneIntersectLine |
D3DXPlaneFromPointNormal | XMPlaneFromPointNormal |
D3DXPlaneFromPoints | XMPlaneFromPoints |
D3DXPlaneTransform | XMPlaneTransform |
D3DXPlaneTransformArray | XMPlaneTransformStream |
D3DXColorNegative | XMColorNegative |
D3DXColorLägg till | XMVectorLägg till |
D3DXColorSubtract | XMVectorSubtract |
D3DXColorScale | XMVectorScale |
D3DXColorModulate | XMColorModulate |
D3DXColorLerp | XMVectorLerp eller XMVectorLerpV |
D3DXColorAdjustSaturation | XMColorAdjustSaturation |
D3DXColorAdjustContrast | XMColorAdjustContrast |
D3DXFresnelTerm | XMFresnelTerm |
Anteckning
Sfäriska harmonier funktioner för DirectXMath är separat tillgängliga. Det finns även en DirectXMath-motsvarighet till ID3DXMatrixStack.