Práce s D3DXMath
D3DXMath je matematická pomocná knihovna pro aplikace Direct3D. D3DXMath existuje již dlouho, je součástí D3DX 9 a D3DX 10 a datuje se zpět i ke starším verzím DirectX.
Poznámka
Knihovna nástrojů D3DX (D3DX 9, D3DX 10 a D3DX 11) je pro Windows 8 zastaralá, proto důrazně doporučujeme migrovat na DirectXMath místo použití D3DXMath.
DirectXMath sdílí většinu stejných funkcí v D3DXMath a interně D3DXMath zahrnuje řadu optimalizací specifických pro procesor. Klíčovým rozdílem je, že D3DXMath je hostovaný v D3DX9*.DLLs a D3DX10*.DLLs, a jen velmi málo funkcí je inlined. Konvence volání knihovny DirectXMath je explicitně přívětivá pro SIMD, zatímco D3DXMath musí provádět převody zatížení a úložiště pro implementaci optimalizace SIMD.
Míchání DirectXMath a D3DXMath
D3DX11 neobsahuje D3DXMath a obecně doporučujeme použít DirectXMath. V aplikaci ale můžete dál odkazovat na D3DX9 a/nebo D3DX10, a proto můžete i nadále používat D3DXMath nebo používat D3DXMath i DirectXMath ve své aplikaci současně.
Obecně je bezpečné přetypovat XMVECTOR* na funkci, která přebírá D3DXVECTOR4* nebo přetypuje XMMATRIX* na funkci, která přebírá D3DXMATRIX*. Inverze však není obecně bezpečná, protože XMVECTOR a XMMATRIX musí být zarovnané na 16 bytů, zatímco D3DXVECTOR4 a D3DXMATRIX nemají žádný takový požadavek. Pokud tento požadavek nedodržíte, může dojít k neplatným výjimkám zarovnání za běhu.
Je bezpečné přetypovat XMVECTOR* na funkci, která přebírá D3DXVECTOR2* nebo D3DXVECTOR3*, ale ne naopak. S ohledem na obavy o zarovnání a skutečnost, že D3DXVECTOR2 a D3DXVECTOR3 jsou menší struktury, je tato operace nebezpečná.
Poznámka
D3DX (a proto D3DXMath) se považuje za starší verzi a není k dispozici pro aplikace pro Windows Store, které běží ve Windows 8 a nejsou součástí sady Windows 8 SDK pro desktopové aplikace.
Použití DirectXMath s Direct3D
DirectXMath i D3DXMath jsou volitelné při práci s Direct3D. Direct3D 9 definovalo D3DMATRIX a D3DCOLOR jako součást rozhraní API Direct3D na podporu pevně funkčního řetězce (nyní zastaralý). D3DXMath v D3DX9 rozšiřuje tyto typy Direct3D 9 o běžné matematické operace grafiky. Pro Direct3D 10.x a Direct3D 11 používá rozhraní API pouze programovatelný kanál, takže neexistuje žádná struktura specifická pro rozhraní API pro matice nebo barevné hodnoty. Pokud novější rozhraní API vyžadují hodnotu barvy, použijí explicitní pole plovoucích hodnot nebo obecnou vyrovnávací paměť konstantních dat, která jsou interpretována pomocí shaderu HLSL. HLSL samotný může podporovat řádkově nebo sloupcově orientované formáty matic, takže rozvržení závisí zcela na vás (další informace najdete v tématu HLSL, Uspořádání matice; pokud ve svých shaderách používáte sloupcově orientované formáty matic, musíte transponovat data matice DirectXMath při ukládání do struktur vaší konstantní vyrovnávací paměti). I když jsou volitelné, knihovny DirectXMath a D3DXMath poskytují společné grafické související funkce, a proto jsou velmi pohodlné při programování Direct3D.
Je bezpečné přetypovat XMVECTOR* na D3DVECTOR* nebo XMMATRIX* na D3DMATRIX*, protože Direct3D 9 nepředpokládá žádné zarovnání příchozí datové struktury. Je také bezpečné přetypovat XMCOLOR na D3DCOLOR. Můžete převést 4 plovoucí reprezentaci barvy na XMCOLOR prostřednictvím XMStoreColor() získat 8:8:8:8:8 32-bit DWORD, který je ekvivalentní D3DCOLOR.
Při práci s Direct3D 10.x nebo Direct3D 11 běžně používáte typy DirectXMath ke konstrukci struktury pro každou z vašich konstantních vyrovnávacích pamětí. V těchto případech do značné míry závisí na vaší schopnosti kontrolovat zarovnání, aby byly tyto struktury efektivní, nebo na používání operací XMStore*() pro převod dat XMVECTOR a XMMATRIX na správné datové typy. Při volání rozhraní API Direct3D 10.x nebo Direct3D 11, která vyžadují pole float[4] s barevnými hodnotami, můžete přetypovat ukazatel XMVECTOR* nebo XMFLOAT4*, který obsahuje barevná data.
Přenos z D3DXMath
D3DXMath – typ | Ekvivalent DirectXMath |
---|---|
D3DXFLOAT16 | POLOVIČNÍ |
D3DXMATRIX | XMFLOAT4X4 |
D3DXMATRIXA16 | XMMATRIX nebo XMFLOAT4X4A |
D3DXQUATERNION D3DXPLANE D3DXCOLOR |
XMVECTOR se používá místo unikátních typů, takže pravděpodobně budete muset použít XMFLOAT4. Poznámka:**D3DXQUATERNION::operator *** volá funkci D3DXQuaternionMultiply, která násobí dvě kvaterniony. Pokud však explicitně nepoužijete funkci XMQuaternionMultiply, získáte při použití **XMVECTOR::operator *** na kvaternionu nesprávnou odpověď. |
D3DXVECTOR2 | XMFLOAT2 |
D3DXVECTOR2_16F | XMHALF2 |
D3DXVECTOR3 | XMFLOAT3 |
D3DXVECTOR4 |
XMFLOAT4(nebo pokud můžete zaručit, že jsou data zarovnaná na 16 bajtů, XMVECTOR nebo XMFLOAT4A ) |
D3DXVECTOR4_16F | XMHALF4 |
Poznámka
V XNAMath není žádný přímý ekvivalent D3DXVECTOR3_16F.
D3DXMath – makro | Ekvivalent DirectXMath |
---|---|
D3DX_PI | XM_PI |
D3DX_1BYPI | XM_1DIVPI |
D3DXToRadian | PřevéstNaRadiany |
D3DXToDegree | XMConvertToDegrees |
D3DXMath – funkce | Ekvivalent 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 nebo XMVector2LengthEst |
D3DXVec2LengthSq | XMVector2LengthSq |
D3DXVec2Dot | XMVector2Dot |
D3DXVec2CCW | XMVector2Cross |
D3DXVec2Add | XMVectorAdd |
D3DXVec2Subtract | XMVectorSubtract |
D3DXVec2Minimize | XMVectorMin |
D3DXVec2Maximize | XMVectorMax |
D3DXVec2Scale | XMVectorScale |
D3DXVec2Lerp | XMVectorLerp nebo XMVectorLerpV |
D3DXVec2Normalize | XMVector2Normalize nebo XMVector2NormalizeEst |
D3DXVec2Hermite | XMVectorHermite nebo XMVectorHermiteV |
D3DXVec2CatmullRom | XMVectorCatmullRom nebo XMVectorCatmullRomV |
D3DXVec2BaryCentric | XMVectorBaryCentric nebo XMVectorBaryCentricV |
D3DXVec2Transform | XMVector2Transform |
D3DXVec2TransformCoord | XMVector2TransformCoord |
D3DXVec2TransformNormal | XMVector2TransformNormal |
D3DXVec2TransformArray | XMVector2TransformStream |
D3DXVec2TransformCoordArray | XMVector2TransformCoordStream |
D3DXVec2TransformNormalArray | XMVector2TransformNormalStream |
D3DXVec3Length | XMVector3Length nebo XMVector3LengthEst |
D3DXVec3LengthSq | XMVector3LengthSq |
D3DXVec3Dot | XMVector3Dot |
D3DXVec3Cross | XMVector3Cross |
D3DXVec3Add | XMVectorAdd |
D3DXVec3Subtract | XMVectorSubtract |
D3DXVec3Minimize | XMVectorMin |
D3DXVec3Maximize | XMVectorMax |
D3DXVec3Scale | XMVectorScale |
D3DXVec3Lerp | XMVectorLerp nebo XMVectorLerpV |
D3DXVec3Normalize | XMVector3Normalize nebo XMVector3NormalizeEst |
D3DXVec3Hermite | XMVectorHermite nebo XMVectorHermiteV |
D3DXVec3CatmullRom | XMVectorCatmullRom nebo XMVectorCatmullRomV |
D3DXVec3BaryCentric | XMVectorBaryCentric nebo XMVectorBaryCentricV |
D3DXVec3Transform | XMVector3Transform |
D3DXVec3TransformCoord | XMVector3TransformCoord |
D3DXVec3TransformNormal | XMVector3TransformNormal |
D3DXVec3TransformArray | XMVector3TransformStream |
D3DXVec3TransformCoordArray | XMVector3TransformCoordStream |
D3DXVec3TransformNormalArray | XMVector3TransformNormalStream |
D3DXVec3Project | XMVector3Project |
D3DXVec3Unproject | XMVector3Unproject |
D3DXVec3ProjectArray | XMVector3ProjectStream |
D3DXVec3UnprojectArray | XMVector3UnprojectStream |
D3DXVec4Length | XMVector4Length nebo XMVector4LengthEst |
D3DXVec4LengthSq | XMVector4LengthSq |
D3DXVec4Dot | XMVector4Dot |
D3DXVec4Add | XMVectorAdd |
D3DXVec4Subtract | XMVectorSubtract |
D3DXVec4Minimize | XMVectorMin |
D3DXVec4Maximize | XMVectorMax |
D3DXVec4Scale | XMVectorScale |
D3DXVec4Lerp | XMVectorLerp nebo XMVectorLerpV |
D3DXVec4Cross | XMVector4Cross |
D3DXVec4Normalize | XMVector4Normalize nebo XMVector4NormalizeEst |
D3DXVec4Hermite | XMVectorHermite nebo XMVectorHermiteV |
D3DXVec4CatmullRom | XMVectorCatmullRom nebo XMVectorCatmullRomV |
D3DXVec4BaryCentric | XMVectorBaryCentric nebo 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 (Všimněte si, že pořadí parametrů se liší: D3DXMatrixRotationYawPitchRoll bere yaw, pitch, roll, XMMatrixRotationRollPitchYaw bere 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 (Všimněte si, že pořadí parametrů se liší: D3DXQuaternionRotationYawPitchRoll přebírá odklon, sklon, rotaci, XMQuaternionRotationRollPitchYaw přebírá sklon, odklon, rotaci) |
D3DXQuaternionMultiply | XMQuaternionMultiply |
D3DXQuaternionNormalize | XMQuaternionNormalize nebo XMQuaternionNormalizeEst |
D3DXQuaternionInverse | XMQuaternionInverse |
D3DXQuaternionLn | XMQuaternionLn |
D3DXQuaternionExp | XMQuaternionExp |
D3DXQuaternionSlerp | XMQuaternionSlerp nebo XMQuaternionSlerpV |
D3DXQuaternionSquad | XMQuaternionSquad nebo XMQuaternionSquadV |
D3DXQuaternionSquadSetup | XMQuaternionSquadSetup |
D3DXQuaternionBaryCentric | XMQuaternionBaryCentric nebo XMQuaternionBaryCentricV |
D3DXPlaneDot | XMPlaneDot |
D3DXPlaneDotCoord | XMPlaneDotCoord |
D3DXPlaneDotNormal | XMPlaneDotNormal |
D3DXPlaneScale | XMVectorScale |
D3DXPlaneNormalize | XMPlaneNormalize nebo XMPlaneNormalizeEst |
D3DXPlaneIntersectLine | XMPlaneIntersectLine |
D3DXPlaneFromPointNormal | XMPlaneFromPointNormal |
D3DXPlaneFromPoints | XMPlaneFromPoints |
D3DXPlaneTransform | XMPlaneTransform |
D3DXPlaneTransformArray | XMPlaneTransformStream |
D3DXColorNegative | XMColorNegative |
D3DXColorAdd | XMVectorAdd |
D3DXColorSubtract | XMVectorSubtract |
D3DXColorScale | XMVectorScale |
D3DXColorModulate | XMColorModulate |
D3DXColorLerp | XMVectorLerp nebo XMVectorLerpV |
D3DXColorAdjustSaturation | XMColorAdjustSaturation |
D3DXColorAdjustContrast | XMColorAdjustContrast |
D3DXFresnelTerm | XMFresnelTerm |
Poznámka
Sférické harmonické funkce pro DirectXMath jsou k dispozici samostatně. K dispozici je také DirectXMath jako alternativa k ID3DXMatrixStack.
Související témata
-
Průvodce programováním DirectXMath