Verwenden von D3DXMath
D3DXMath ist eine mathematische Hilfsbibliothek für Direct3D-Anwendungen. D3DXMath hat eine lange Tradition, ist in D3DX 9 und D3DX 10 enthalten und geht auch auf ältere Versionen von DirectX zurück.
Hinweis
Die D3DX-Hilfsbibliothek (D3DX 9, D3DX 10 und D3DX 11) ist für Windows 8 veraltet, daher empfehlen wir Ihnen dringend, auf DirectXMath zu migrieren, anstatt D3DXMath zu verwenden.
DirectXMath verfügt über einen Großteil der gleichen Funktionalität wie D3DXMath, und intern enthält D3DXMath eine Reihe von prozessorspezifischen Optimierungen. Der Hauptunterschied besteht darin, dass D3DXMath in den D3DX9*.DLLs und D3DX10*.DLLs gehostet wird und nur sehr wenige der Funktionen inline sind. Die Aufrufkonvention der DirectXMath-Bibliothek ist explizit SIMD-freundlich, während D3DXMath zur Implementierung der SIMD-Optimierung Ladungs- und Store-Konvertierungen durchführen muss.
Vermischung von DirectXMath und D3DXMath
D3DX11 enthält kein D3DXMath, und wir empfehlen allgemein, stattdessen DirectXMath zu verwenden. Es steht Ihnen jedoch frei, in Ihrer Anwendung weiterhin auf D3DX9 und/oder D3DX10 zu linken. Sie könnten also weiterhin D3DXMath oder sowohl D3DXMath als auch DirectXMath gleichzeitig in Ihrer Anwendung verwenden.
Allgemein ist es sicher, einen XMVECTOR* an eine Funktion zu übergeben, die D3DXVECTOR4* entgegennimmt, oder einen XMMATRIX* an eine Funktion zu übergeben, die D3DXMATRIX* entgegennimmt. Der umgekehrte Weg ist jedoch nicht generell sicher, da XMVECTOR und XMMATRIX 16-Byte-ausgerichtet sein müssen, während für D3DXVECTOR4 und D3DXMATRIX keine solche Anforderung besteht. Die Nichteinhaltung dieser Anforderung kann zur Laufzeit zu Ausnahmen bezüglich der ungültigen Ausrichtung führen.
Es ist sicher, einen XMVECTOR* an eine Funktion zu übergeben, die D3DXVECTOR2* oder D3DXVECTOR3* entgegennimmt, aber nicht umgekehrt. Sowohl Bedenken hinsichtlich der Ausrichtung als auch die Tatsache, dass D3DXVECTOR2 und D3DXVECTOR3 kleinere Strukturen sind, machen diesen Vorgang unsicher.
Hinweis
D3DX (und damit auch D3DXMath) gilt als veraltet und ist für Apps im Windows Store, die unter Windows 8 ausgeführt werden, nicht verfügbar und ist auch nicht im Windows 8-SDK für Desktop-Apps enthalten.
Verwendung von DirectXMath mit Direct3D
Sowohl DirectXMath als auch D3DXMath sind optional, wenn Sie mit Direct3D arbeiten. Direct3D 9 definierte D3DMATRIX und D3DCOLOR als Teil der Direct3D-API zur Unterstützung der (jetzt veralteten) Pipeline mit festen Funktionen. D3DXMath in D3DX9 erweitert diese Direct3D 9-Typen um allgemeine grafische mathematische Operationen. Für Direct3D 10.x und Direct3D 11 verwendet die API nur die programmierbare Pipeline, sodass es keine API-spezifische Struktur für Matrizen oder Farbwerte gibt. Wenn die neueren APIs einen Farbwert benötigen, nehmen sie ein explizites Array von Float-Werten oder einen generischen Puffer mit konstanten Daten, der vom HLSL-Shader interpretiert wird. HLSL selbst kann sowohl zeilen- als auch spalten-dominante Matrixformate unterstützen, sodass das Layout ganz Ihnen überlassen bleibt (weitere Informationen finden Sie unter HLSL, Matrixanordnung; wenn Sie spalten-dominante Matrixformate in Ihren Shadern verwenden, müssen Sie die DirectXMath-Matrixdaten transponieren, wenn Sie sie in Ihren konstanten Pufferstrukturen platzieren). Die Bibliotheken DirectXMath und D3DXMath sind zwar optional, bieten aber beide allgemeine grafikbezogene Funktionen und sind daher bei der Direct3D-Programmierung äußerst praktisch.
Es ist sicher, einen XMVECTOR* in einen D3DVECTOR* oder einen XMMATRIX* in einen D3DMATRIX* zu wandeln, da Direct3D 9 keine Annahmen über die Ausrichtung der eingehenden Datenstruktur trifft. Es ist auch sicher, XMCOLOR in D3DCOLOR zu wandeln. Sie können eine 4-Float-Darstellung der Farbe über XMStoreColor() in XMCOLOR umwandeln, um das 8:8:8:8 32-Bit DWORD zu erhalten, das D3DCOLOR entspricht.
Wenn Sie mit Direct3D 10.x oder Direct3D 11 arbeiten, werden Sie in der Regel DirectXMath-Typen verwenden, um eine Struktur für jeden Ihrer Konstantenpuffer zu erstellen. In diesen Fällen hängt es weitgehend von Ihrer Möglichkeit ab, die Ausrichtung zu steuern, um diese effizient zu machen, oder XMStore*()-Operationen zu verwenden, um XMVECTOR- und XMMATRIX-Daten in die richtigen Datentypen zu konvertieren. Wenn Sie Direct3D 10.x- oder Direct3D 11-APIs aufrufen, die ein float[4]-Array mit Farbwerten erfordern, können Sie einen XMVECTOR* oder XMFLOAT4* casten, der die Farbdaten enthält.
Portierung von D3DXMath
D3DXMath-Typ | DirectXMath-Äquivalent |
---|---|
D3DXFLOAT16 | HALF |
D3DXMATRIX | XMFLOAT4X4 |
D3DXMATRIXA16 | XMMATRIX oder XMFLOAT4X4A |
D3DXQUATERNION D3DXPLANE D3DXCOLOR |
XMVECTOR wird anstelle von eindeutigen Typen verwendet, sodass Sie wahrscheinlich einen XMFLOAT4 verwenden. Anmerkung: **D3DXQUATERNION::operator *** ruft die Funktion D3DXQuaternionMultiply auf, die zwei Quaternionen multipliziert. Wenn Sie jedoch nicht ausdrücklich die Funktion XMQuaternionMultiply verwenden, erhalten Sie eine falsche Antwort, wenn Sie **XMVECTOR::operator *** auf ein Quaternion anwenden. |
D3DXVECTOR2 | XMFLOAT2 |
D3DXVECTOR2_16F | XMHALF2 |
D3DXVECTOR3 | XMFLOAT3 |
D3DXVECTOR4 | XMFLOAT4(oder wenn Sie garantieren können, dass die Daten auf 16 Byte ausgerichtet sind, XMVECTOR oder XMFLOAT4A ) |
D3DXVECTOR4_16F | XMHALF4 |
Hinweis
Es gibt keine direkte Entsprechung zu D3DXVECTOR3_16F in XNAMath.
D3DXMath-Makro | DirectXMath-Äquivalent |
---|---|
D3DX_PI | XM_PI |
D3DX_1BYPI | XM_1DIVPI |
D3DXToRadian | XMConvertToRadians |
D3DXToDegree | XMConvertToDegrees |
D3DXMath-Funktion | DirectXMath-Äquivalent |
---|---|
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 oder XMVector2LengthEst |
D3DXVec2LengthSq | XMVector2LengthSq |
D3DXVec2Dot | XMVector2Dot |
D3DXVec2CCW | XMVector2Cross |
D3DXVec2Add | XMVectorAdd |
D3DXVec2Subtract | XMVectorSubtract |
D3DXVec2Minimize | XMVectorMin |
D3DXVec2Maximize | XMVectorMax |
D3DXVec2Scale | XMVectorScale |
D3DXVec2Lerp | XMVectorLerp oder XMVectorLerpV |
D3DXVec2Normalize | XMVector2Normalize oder XMVector2NormalizeEst |
D3DXVec2Hermite | XMVectorHermite oder XMVectorHermiteV |
D3DXVec2CatmullRom | XMVectorCatmullRom oder XMVectorCatmullRomV |
D3DXVec2BaryCentric | XMVectorBaryCentric oder XMVectorBaryCentricV |
D3DXVec2Transform | XMVector2Transform |
D3DXVec2TransformCoord | XMVector2TransformCoord |
D3DXVec2TransformNormal | XMVector2TransformNormal |
D3DXVec2TransformArray | XMVector2TransformStream |
D3DXVec2TransformCoordArray | XMVector2TransformCoordStream |
D3DXVec2TransformNormalArray | XMVector2TransformNormalStream |
D3DXVec3Length | XMVector3Length oder XMVector3LengthEst |
D3DXVec3LengthSq | XMVector3LengthSq |
D3DXVec3Dot | XMVector3Dot |
D3DXVec3Cross | XMVector3Cross |
D3DXVec3Add | XMVectorAdd |
D3DXVec3Subtract | XMVectorSubtract |
D3DXVec3Minimize | XMVectorMin |
D3DXVec3Maximize | XMVectorMax |
D3DXVec3Scale | XMVectorScale |
D3DXVec3Lerp | XMVectorLerp oder XMVectorLerpV |
D3DXVec3Normalize | XMVector3Normalize oder XMVector3NormalizeEst |
D3DXVec3Hermite | XMVectorHermite oder XMVectorHermiteV |
D3DXVec3CatmullRom | XMVectorCatmullRom oder XMVectorCatmullRomV |
D3DXVec3BaryCentric | XMVectorBaryCentric oder XMVectorBaryCentricV |
D3DXVec3Transform | XMVector3Transform |
D3DXVec3TransformCoord | XMVector3TransformCoord |
D3DXVec3TransformNormal | XMVector3TransformNormal |
D3DXVec3TransformArray | XMVector3TransformStream |
D3DXVec3TransformCoordArray | XMVector3TransformCoordStream |
D3DXVec3TransformNormalArray | XMVector3TransformNormalStream |
D3DXVec3Project | XMVector3Project |
D3DXVec3Unproject | XMVector3Unproject |
D3DXVec3ProjectArray | XMVector3ProjectStream |
D3DXVec3UnprojectArray | XMVector3UnprojectStream |
D3DXVec4Length | XMVector4Length oder XMVector4LengthEst |
D3DXVec4LengthSq | XMVector4LengthSq |
D3DXVec4Dot | XMVector4Dot |
D3DXVec4Add | XMVectorAdd |
D3DXVec4Subtract | XMVectorSubtract |
D3DXVec4Minimize | XMVectorMin |
D3DXVec4Maximize | XMVectorMax |
D3DXVec4Scale | XMVectorScale |
D3DXVec4Lerp | XMVectorLerp oder XMVectorLerpV |
D3DXVec4Cross | XMVector4Cross |
D3DXVec4Normalize | XMVector4Normalize oder XMVector4NormalizeEst |
D3DXVec4Hermite | XMVectorHermite oder XMVectorHermiteV |
D3DXVec4CatmullRom | XMVectorCatmullRom oder XMVectorCatmullRomV |
D3DXVec4BaryCentric | XMVectorBaryCentric oder 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 (Beachten Sie, dass die Reihenfolge der Parameter unterschiedlich ist: D3DXMatrixRotationYawPitchRoll erwartet Yaw, Pitch, Roll, XMMatrixRotationRollPitchYaw erwartet 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 (Beachten Sie, dass die Reihenfolge der Parameter unterschiedlich ist: D3DXQuaternionRotationYawPitchRoll erwartet Yaw, Pitch, Roll, XMQuaternionRotationRollPitchYaw erwartet Pitch, Yaw, Roll) |
D3DXQuaternionMultiply | XMQuaternionMultiply |
D3DXQuaternionNormalize | XMQuaternionNormalize oder XMQuaternionNormalizeEst |
D3DXQuaternionInverse | XMQuaternionInverse |
D3DXQuaternionLn | XMQuaternionLn |
D3DXQuaternionExp | XMQuaternionExp |
D3DXQuaternionSlerp | XMQuaternionSlerp oder XMQuaternionSlerpV |
D3DXQuaternionSquad | XMQuaternionSquad oder XMQuaternionSquadV |
D3DXQuaternionSquadSetup | XMQuaternionSquadSetup |
D3DXQuaternionBaryCentric | XMQuaternionBaryCentric oder XMQuaternionBaryCentricV |
D3DXPlaneDot | XMPlaneDot |
D3DXPlaneDotCoord | XMPlaneDotCoord |
D3DXPlaneDotNormal | XMPlaneDotNormal |
D3DXPlaneScale | XMVectorScale |
D3DXPlaneNormalize | XMPlaneNormalize oder XMPlaneNormalizeEst |
D3DXPlaneIntersectLine | XMPlaneIntersectLine |
D3DXPlaneFromPointNormal | XMPlaneFromPointNormal |
D3DXPlaneFromPoints | XMPlaneFromPoints |
D3DXPlaneTransform | XMPlaneTransform |
D3DXPlaneTransformArray | XMPlaneTransformStream |
D3DXColorNegative | XMColorNegative |
D3DXColorAdd | XMVectorAdd |
D3DXColorSubtract | XMVectorSubtract |
D3DXColorScale | XMVectorScale |
D3DXColorModulate | XMColorModulate |
D3DXColorLerp | XMVectorLerp oder XMVectorLerpV |
D3DXColorAdjustSaturation | XMColorAdjustSaturation |
D3DXColorAdjustContrast | XMColorAdjustContrast |
D3DXFresnelTerm | XMFresnelTerm |
Hinweis
Spherical Harmonics-Funktionen für DirectXMath sind separat verfügbar. Ein DirectXMath-Gegenstück zu ID3DXMatrixStack ist ebenfalls verfügbar.
Zugehörige Themen