Sdílet prostřednictvím


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.

 

Průvodce programováním DirectXMath