Bekerja dengan D3DXMath

D3DXMath adalah pustaka pembantu matematika untuk aplikasi Direct3D. D3DXMath berdurasi lama, disertakan dalam D3DX 9 dan D3DX 10, dan juga tanggal kembali ke versi DirectX yang lebih lama.

Catatan

Pustaka utilitas D3DX (D3DX 9, D3DX 10, dan D3DX 11) tidak digunakan lagi untuk Windows 8, jadi kami sangat menyarankan Anda bermigrasi ke DirectXMath daripada menggunakan D3DXMath.

 

DirectXMath berbagi banyak fungsionalitas yang sama di D3DXMath, dan secara internal D3DXMath mencakup sejumlah pengoptimalan khusus prosesor. Perbedaan utamanya adalah bahwa D3DXMath dihosting di D3DX9*. DLL dan D3DX10*. DLL, dan sangat sedikit fungsi yang sebaris. Konvensi panggilan Pustaka DirectXMath secara eksplisit ramah SIMD, sedangkan D3DXMath harus melakukan konversi beban dan penyimpanan untuk mengimplementasikan pengoptimalan SIMD.

Mencampur DirectXMath dan D3DXMath

D3DX11 tidak berisi D3DXMath, dan secara umum sebaiknya gunakan DirectXMath sebagai gantinya. Namun, Anda bebas untuk terus menautkan ke D3DX9 dan/atau D3DX10 di aplikasi Anda, dan oleh karena itu Anda dapat terus menggunakan D3DXMath atau menggunakan D3DXMath dan DirectXMath di aplikasi Anda secara bersamaan.

Secara umum aman untuk mentransmisikan XMVECTOR* ke fungsi yang membutuhkan D3DXVECTOR4* atau untuk mentransmisikan XMMATRIX* ke fungsi yang membutuhkan D3DXMATRIX*. Inversinya adalah, bagaimanapun, umumnya tidak aman karena XMVECTOR dan XMMATRIX harus selaras 16 byte, sementara D3DXVECTOR4 dan D3DXMATRIX tidak memiliki persyaratan tersebut. Kegagalan untuk mematuhi persyaratan ini dapat mengakibatkan pengecualian perataan yang tidak valid pada runtime.

Aman untuk mentransmisikan XMVECTOR* ke fungsi yang membutuhkan D3DXVECTOR2* atau D3DXVECTOR3*, tetapi tidak sebaliknya. Kekhawatiran penyelarasan dan fakta bahwa D3DXVECTOR2 dan D3DXVECTOR3 adalah struktur yang lebih kecil menjadikan ini operasi yang tidak aman.

Catatan

D3DX (dan oleh karena itu D3DXMath) dianggap warisan, dan tidak tersedia untuk aplikasi Windows Store yang berjalan pada Windows 8 dan tidak termasuk dalam Windows 8 SDK untuk aplikasi desktop.

 

Menggunakan DirectXMath dengan Direct3D

DirectXMath dan D3DXMath bersifat opsional saat bekerja dengan Direct3D. Direct3D 9 mendefinisikan D3DMATRIX dan D3DCOLOR sebagai bagian dari API Direct3D untuk mendukung alur fungsi tetap (sekarang warisan). D3DXMath di D3DX9 memperluas jenis Direct3D 9 ini dengan operasi matematika grafis umum. Untuk Direct3D 10.x dan Direct3D 11, API hanya menggunakan alur yang dapat diprogram sehingga tidak ada struktur khusus API untuk matriks atau nilai warna. Ketika API yang lebih baru memerlukan nilai warna, API tersebut mengambil array eksplisit nilai float atau buffer generik data konstan yang ditafsirkan oleh shader HLSL. HLSL sendiri dapat mendukung format matriks row-major atau column-major, sehingga tata letak sepenuhnya terserah Anda (untuk informasi selengkapnya, lihat HLSL, Matrix Ordering; jika Anda menggunakan format matriks utama kolom di shader Anda, Anda perlu mengubah data matriks DirectXMath saat Anda menempatkannya ke dalam struktur buffer konstan Anda). Meskipun opsional, pustaka DirectXMath dan D3DXMath keduanya menyediakan fungsionalitas terkait grafis umum, dan oleh karena itu sangat nyaman saat melakukan pemrograman Direct3D.

Aman untuk mentransmisikan XMVECTOR* ke D3DVECTOR* atau XMMATRIX* ke D3DMATRIX* karena Direct3D 9 tidak membuat asumsi penyelarasan tentang struktur data masuk. Anda juga dapat melemparkan XMCOLOR ke D3DCOLOR. Anda dapat mengonversi representasi warna 4-float ke XMCOLOR melalui XMStoreColor() untuk mendapatkan DWORD 8:8:8:8 32-bit yang setara dengan D3DCOLOR.

Saat bekerja dengan Direct3D 10.x atau Direct3D 11, Anda biasanya akan menggunakan jenis DirectXMath untuk membangun struktur untuk setiap buffer konstan Anda, dan dalam kasus tersebut sebagian besar tergantung pada kemampuan Anda untuk mengontrol keselarasan agar efisien ini, atau menggunakan operasi XMStore*() untuk mengonversi data XMVECTOR dan XMMATRIX ke jenis data yang benar. Saat memanggil API Direct3D 10.x atau Direct3D 11 yang memerlukan array nilai warna float[4], Anda dapat mentransmisikan XMVECTOR* atau XMFLOAT4* yang berisi data warna.

Porting dari D3DXMath

Tipe D3DXMath Setara DirectXMath
D3DXFLOAT16 SETENGAH
D3DXMATRIX XMFLOAT4X4
D3DXMATRIXA16 XMMATRIX atau XMFLOAT4X4A
D3DXQUATERNION
D3DXPLANE
D3DXCOLOR
XMVECTOR digunakan daripada memiliki jenis unik, jadi Anda mungkin perlu menggunakan Catatan XMFLOAT4:**D3DXQUATERNION::operator *** memanggil fungsi D3DXQuaternionMultiply, yang mengalikan dua kuaternion. Tetapi, kecuali Anda secara eksplisit menggunakan fungsi XMQuaternionMultiply , Anda mendapatkan jawaban yang salah ketika Anda menggunakan **XMVECTOR::operator *** pada quaternion.
D3DXVECTOR2 XMFLOAT2
D3DXVECTOR2_16F XMHALF2
D3DXVECTOR3 XMFLOAT3
D3DXVECTOR4 XMFLOAT4(atau jika Anda dapat menjamin data selaras 16 byte, XMVECTOR atau XMFLOAT4A )
D3DXVECTOR4_16F XMHALF4

 

Catatan

Tidak ada yang setara langsung dengan D3DXVECTOR3_16F di XNAMath.

 

Makro D3DXMath Setara DirectXMath
D3DX_PI XM_PI
D3DX_1BYPI XM_1DIVPI
D3DXToRadian XMConvertToRadians
D3DXToDegree XMConvertToDegrees

 

Fungsi D3DXMath Setara 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 atau XMVector2LengthEst
D3DXVec2LengthSq XMVector2LengthSq
D3DXVec2Dot XMVector2Dot
D3DXVec2CCW XMVector2Cross
D3DXVec2Tambahkan XMVectorAdd
D3DXVec2Subtract XMVectorSubtract
D3DXVec2Minimize XMVectorMin
D3DXVec2Maximize XMVectorMax
D3DXVec2Scale XMVectorScale
D3DXVec2Lerp XMVectorLerp atau XMVectorLerpV
D3DXVec2Normalize XMVector2Normalize atau XMVector2NormalizeEst
D3DXVec2Hermite XMVectorHermite atau XMVectorHermiteV
D3DXVec2CatmullRom XMVectorCatmullRom atau XMVectorCatmullRomV
D3DXVec2BaryCentric XMVectorBaryCentric atau XMVectorBaryCentricV
D3DXVec2Transform XMVector2Transform
D3DXVec2TransformCoord XMVector2TransformCoord
D3DXVec2TransformNormal XMVector2TransformNormal
D3DXVec2TransformArray XMVector2TransformStream
D3DXVec2TransformCoordArray XMVector2TransformCoordStream
D3DXVec2TransformNormalArray XMVector2TransformNormalStream
D3DXVec3Length XMVector3Length atau XMVector3LengthEst
D3DXVec3LengthSq XMVector3LengthSq
D3DXVec3Dot XMVector3Dot
D3DXVec3Cross XMVector3Cross
D3DXVec3Tambahkan XMVectorAdd
D3DXVec3Subtract XMVectorSubtract
D3DXVec3Minimize XMVectorMin
D3DXVec3Maximize XMVectorMax
D3DXVec3Scale XMVectorScale
D3DXVec3Lerp XMVectorLerp atau XMVectorLerpV
D3DXVec3Normalize XMVector3Normalize atau XMVector3NormalizeEst
D3DXVec3Hermite XMVectorHermite atau XMVectorHermiteV
D3DXVec3CatmullRom XMVectorCatmullRom atau XMVectorCatmullRomV
D3DXVec3BaryCentric XMVectorBaryCentric atau XMVectorBaryCentricV
D3DXVec3Transform XMVector3Transform
D3DXVec3TransformCoord XMVector3TransformCoord
D3DXVec3TransformNormal XMVector3TransformNormal
D3DXVec3TransformArray XMVector3TransformStream
D3DXVec3TransformCoordArray XMVector3TransformCoordStream
D3DXVec3TransformNormalArray XMVector3TransformNormalStream
D3DXVec3Project XMVector3Project
D3DXVec3Unproject XMVector3Unproject
D3DXVec3ProjectArray XMVector3ProjectStream
D3DXVec3UnprojectArray XMVector3UnprojectStream
D3DXVec4Length XMVector4Length atau XMVector4LengthEst
D3DXVec4LengthSq XMVector4LengthSq
D3DXVec4Dot XMVector4Dot
D3DXVec4Tambahkan XMVectorAdd
D3DXVec4Subtract XMVectorSubtract
D3DXVec4Minimize XMVectorMin
D3DXVec4Maximize XMVectorMax
D3DXVec4Scale XMVectorScale
D3DXVec4Lerp XMVectorLerp atau XMVectorLerpV
D3DXVec4Cross XMVector4Cross
D3DXVec4Normalize XMVector4Normalize atau XMVector4NormalizeEst
D3DXVec4Hermite XMVectorHermite atau XMVectorHermiteV
D3DXVec4CatmullRom XMVectorCatmullRom atau XMVectorCatmullRomV
D3DXVec4BaryCentric XMVectorBaryCentric atau 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 (Perhatikan urutan parameter berbeda: D3DXMatrixRotationYawPitchRoll mengambil yaw, pitch, roll, XMMatrixRotationRollPitchYaw mengambil 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
D3DXMatrixOrthoffCenterRH XMMatrixOrthographicOffCenterRH
D3DXMatrixOrthoffCenterLH 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 (Perhatikan urutan parameter berbeda: D3DXQuaternionRotationYawPitchRoll mengambil yaw, pitch, roll, XMQuaternionRotationRollPitchYaw mengambil pitch, yaw, roll)
D3DXQuaternionMultiply XMQuaternionMultiply
D3DXQuaternionNormalize XMQuaternionNormalize atau XMQuaternionNormalizeEst
D3DXQuaternionInverse XMQuaternionInverse
D3DXQuaternionLn XMQuaternionLn
D3DXQuaternionExp XMQuaternionExp
D3DXQuaternionSlerp XMQuaternionSlerp atau XMQuaternionSlerpV
D3DXQuaternionSquad XMQuaternionSquad atau XMQuaternionSquadV
D3DXQuaternionSquadSetup XMQuaternionSquadSetup
D3DXQuaternionBaryCentric XMQuaternionBaryCentric atau XMQuaternionBaryCentricV
D3DXPlaneDot XMPlaneDot
D3DXPlaneDotCoord XMPlaneDotCoord
D3DXPlaneDotNormal XMPlaneDotNormal
D3DXPlaneScale XMVectorScale
D3DXPlaneNormalize XMPlaneNormalize atau XMPlaneNormalizeEst
D3DXPlaneIntersectLine XMPlaneIntersectLine
D3DXPlaneFromPointNormal XMPlaneFromPointNormal
D3DXPlaneFromPoints XMPlaneFromPoints
D3DXPlaneTransform XMPlaneTransform
D3DXPlaneTransformArray XMPlaneTransformStream
D3DXColorNegative XMColorNegative
D3DXColorAdd XMVectorAdd
D3DXColorSubtract XMVectorSubtract
D3DXColorScale XMVectorScale
D3DXColorModulate XMColorModulate
D3DXColorLerp XMVectorLerp atau XMVectorLerpV
D3DXColorAdjustSaturation XMColorAdjustSaturation
D3DXColorAdjustContrast XMColorAdjustContrast
D3DXFresnelTerm XMFresnelTerm

 

Catatan

Fungsi Spherical Harmonics untuk DirectXMath tersedia secara terpisah. DirectXMath yang setara dengan ID3DXMatrixStack juga tersedia.

 

Panduan Pemrograman DirectXMath