Sdílet prostřednictvím


Začínáme (DirectXMath)

Knihovna DirectXMath implementuje optimální a přenosné rozhraní pro aritmetické a lineární algebra operace s jednoduchými vektory s plovoucí desetinnou čárkou (2D, 3D a 4D) nebo matice (3×3 a 4×4). Knihovna má omezenou podporu operací celočíselného vektoru. Tyto operace se široce používají při vykreslování a animaci grafickými programy. Podpora pro vektory s dvojitou přesností (včetně dlouhých, krátkých nebo bajtů) neexistuje a pouze omezené celočíselné vektorové operace jsou podporovány.

Knihovna je dostupná na různých platformách Windows. Vzhledem k tomu, že knihovna poskytuje funkce, které nejsou dříve k dispozici, nahrazuje tato verze následující knihovny:

  • Knihovna Xbox Math poskytovaná hlavičkovým souborem Xboxmath.h
  • Knihovna D3DX 9 poskytovaná soubory DLL D3DX 9
  • Matematická knihovna D3DX 10 poskytovaná prostřednictvím knihoven DLL D3DX 10
  • Knihovna XNA Math poskytovaná prostřednictvím hlavičky xnamath.h v DirectX SDK a Xbox 360 XDK

Tyto části popisují základy, jak začít.

Stáhnout

Knihovna DirectXMath je součástí sady Windows SDK. Alternativně si ho můžete stáhnout z GitHubu/ Microsoft/DirectXMath. Tento web obsahuje také související ukázkové projekty.

požadavky na systém Run-Time

Knihovna DirectXMath používá specializované instrukce procesoru pro vektorové operace, pokud jsou k dispozici. Pokud se chcete vyhnout tomu, aby program generoval chyby neznámé instrukce, zkontrolujte podporu procesoru voláním XMVerifyCPUSupport před použitím knihovny DirectXMath.

Toto jsou základní požadavky na podporu za běhu knihovny DirectXMath:

  • Výchozí kompilace na platformě Windows (x86/x64) vyžaduje podporu instrukcí SSE/SSE2.
  • Výchozí kompilace na platformě Windows RT vyžaduje podporu instrukce ARM-NEON.
  • Kompilace s definovanými _XM_NO_INTRINSICS_ vyžaduje pouze podporu standardní operace s plovoucí desetinnou čárkou.

Poznámka

Při volání XMVerifyCPUSupportje třeba zahrnout <windows.h> před <DirectXMath.h>. Toto je jediná funkce v knihovně, která vyžaduje veškerý obsah z <windows.h>, takže nebudete muset zahrnout <windows.h> v každém modulu, který používá <DirectXMath.h>.

 

Přehled návrhu

Knihovna DirectXMath primárně podporuje programovací jazyk C++. Knihovna se implementuje pomocí vložených rutin v hlavičkových souborech DirectXMath*.inl, DirectXPackedVector.inl a DirectXCollision.inl. Tato implementace využívá vnitřní funkce kompilátoru s vysokým výkonem.

Knihovna DirectXMath poskytuje:

  • Implementace využívající vnitřní objekty SSE/SSE2.
  • Implementace bez intrinsic funkcí.
  • Implementace využívající vnitřní objekty ARM-NEON.

Vzhledem k tomu, že knihovna je doručována pomocí souborů hlaviček, použijte zdrojový kód k přizpůsobení a optimalizaci pro vlastní aplikaci.

Konvence matice

DirectXMath používá matice hlavní řady, vektory řádků a předběžné násobení. Ustavení dominance ruky je určeno podle toho, která verze funkce se používá (RH vs. LH), v opačném případě funkce pracuje s levostrannými nebo pravostrannými zobrazeními souřadnic.

Pro referenci používá Direct3D historicky levý souřadnicový systém, matice hlavní řady, vektory řádků a předběžné násobení. Moderní Direct3D nemá silný požadavek na levé a pravé souřadnice a obvykle shadery HLSL ve výchozím nastavení spotřebovávají hlavní matice sloupců. Podrobnosti najdete v řazení matic HLSL.

Základní použití

Chcete-li používat funkce knihovny DirectXMath, zahrňte hlavičky DirectXMath.h, DirectXPackedVector.h, DirectXColors.h a/nebo DirectXCollision.h. Hlavičky najdete v sadě Windows Software Development Kit pro aplikace pro Windows Store.

Pokyny k používání typů

Typy XMVECTOR a XMMATRIX jsou pracovní koně pro knihovnu DirectXMath. Každá operace využívá nebo vytváří data těchto typů. Práce s nimi je klíčem k používání knihovny. Vzhledem k tomu, že DirectXMath využívá sady instrukcí SIMD, podléhají tyto datové typy řadě omezení. Je důležité, abyste těmto omezením porozuměli, pokud chcete dobře využívat funkce DirectXMath.

Měli byste si představit XMVECTOR jako proxy pro registr hardwaru SIMD a XMMATRIX jako proxy pro logické seskupení čtyř registrů hardwaru SIMD. Tyto typy jsou opatřeny poznámkami, které označují, že správné fungování vyžaduje zarovnání 16 bajtů. Kompilátor je automaticky správně umístí do zásobníku, když se použijí jako místní proměnná; nebo je automaticky umístí do datového segmentu, když se použijí jako globální proměnná. Se správnými konvencemi je možné je také bezpečně předat jako parametry do funkce (podrobnosti najdete v tématu konvence volání).

Alokace z haldy jsou ale složitější. Proto musíte být opatrní vždy, když použijete XMVECTOR nebo XMMATRIX jako člen třídy nebo struktury, které se mají přidělit z haldy. Ve Windows x64 jsou všechny alokace haldy 16bytově zarovnané, ale pro Windows x86 jsou zarovnané pouze 8bytově. Existují možnosti přidělování struktur z haldy se zarovnáním 16 bajtů (viz Správně zarovnat přidělení). U programů C++ můžete použít přetížení operátoru new/delete/new[]/delete[] (globálně nebo specifické pro třídu) k vynucení optimálního zarovnání v případě potřeby.

Poznámka

Jako alternativu k vynucování zarovnání ve třídě C++ přímo přetížením new/delete můžete použít pImpl idiom. Pokud zajistíte, aby byla třída Impl zarovnána interně prostřednictvím _aligned_malloc, můžete volně používat zarovnané typy v rámci interní implementace. Toto je dobrá volba, pokud je veřejná třída buď ref Windows Runtime, nebo je určená pro použití s std::shared_ptr<>, což by jinak mohlo narušit pečlivé zarovnání.

 

Často je však jednodušší a kompaktnější vyhnout se použití XMVECTOR nebo XMMATRIX přímo ve třídě nebo struktuře. Místo toho použijte XMFLOAT3, XMFLOAT4, XMFLOAT4X3, XMFLOAT4X4atd. jako členy struktury. Dále můžete pomocí funkcí Vector Loading a Vector Storage data efektivně přesouvat do XMVECTOR nebo XMMATRIX místních proměnných, provádět výpočty a ukládat výsledky. Existují také streamovací funkce (XMVector3TransformStream, XMVector4TransformStreamatd.), které efektivně pracují s poli těchto datových typů.

Vytváření vektorů

KONSTANTNÍ VEKTORY

Mnoho operací vyžaduje použití konstant ve vektorových výpočtech a existuje řada způsobů, jak načíst XMVECTOR s požadovanými hodnotami.

  • Při načítání skalární konstanty do všech prvků XMVECTOR, použijte XMVectorReplicate nebo XMVectorReplicateInt.

    XMVECTOR vFive = XMVectorReplicate( 5.f );
    
  • Pokud používáte vektorovou konstantu s různými pevnými hodnotami jakoXMVECTOR, použijte XMVECTORF32, XMVECTORU32, XMVECTORI32nebo XMVECTORU8 struktury. Na tyto hodnoty pak můžete odkazovat přímo kdekoli, kde byste předali hodnotu XMVECTOR.

    static const XMVECTORF32 vFactors = { 1.0f, 2.0f, 3.0f, 4.0f };
    

    Poznámka

    Nepoužívejte seznamy inicializátorů přímo s XMVECTOR (tj. XMVECTOR v = { 1.0f, 2.0f, 3.0f, 4.0f }). Takový kód je neefektivní a není přenosný napříč všemi platformami, které podporuje DirectXMath.

     

  • DirectXMath obsahuje řadu předdefinovaných globálních konstant, které můžete použít v kódu (g_XMOne, g_XMOne3, g_XMTwo, g_XMOneHalf, g_XMHalfPi, g_XMPi atd.). Vyhledejte v hlavičce DirectXMath.h hodnoty XMGLOBALCONST.

  • Existuje sada vektorových konstant pro běžné barvy RGB (červená, zelená, modrá, žlutá atd.). Další informace o těchto vektorových konstantách naleznete v souboru DirectXColors.h a v namespacu DirectX::Colors.

VEKTORY Z PROMĚNNÝCH

VEKTORY Z VEKTORŮ

  • Pokud vytváříte vektor z jiného vektoru s konkrétní komponentou nastavenou na proměnnou, můžete zvážit použití funkce Vector Accessor Functions.

    XMVECTOR v2 = XMVectorSetW( v1, fw );
    
  • Pokud vytváříte vektor z jiného vektoru s jednou replikovanou komponentou, použijteXMVectorSplatX , XMVectorSplatY, XMVectorSplatZa XMVectorSplatW.

    XMVECTOR vz = XMVectorSplatZ( v );
    
  • Pokud vytváříte vektor z jiného vektoru nebo dvojice vektorů s přeuspořádanými komponentami, přečtěte si XMVectorSwizzle a XMVectorPermute.

    XMVECTOR v2 = XMVectorSwizzle<XM_SWIZZLE_Z, XM_SWIZZLE_Y, XM_SWIZZLE_W, XM_SWIZZLE_X>( v1 );
    
    XMVECTOR v3 = XMVectorPermute<XM_PERMUTE_0W, XM_PERMUTE_1X, XM_PERMUTE_0X, XM_PERMUTE_1Z>( v1, v2 );
    

VEKTORY Z PAMĚTI

Extrakce komponent z vektorů

Zpracování SIMD je nejúčinnější, když se data načtou do registrů SIMD a plně zpracuje před extrahováním výsledků. Převod mezi skalárními a vektorovými formuláři je neefektivní, proto doporučujeme, abyste to udělali jenom v případě potřeby. Z tohoto důvodu jsou funkce v knihovně DirectXMath, které vytvářejí skalární hodnotu, vráceny ve vektorové formě, kde se skalární výsledek replikuje přes výsledný vektor (to znamená XMVector2Dot, XMVector3Lengthatd. Pokud ale potřebujete skalární hodnoty, tady je několik možností, jak na to přejít:

  • Pokud se vypočítá jedna skalární odpověď, je vhodné použít funkce Vector Accessor Functions,:

    float f = XMVectorGetX( v );
    
  • Pokud je potřeba extrahovat více součástí vektoru, zvažte uložení vektoru do struktury paměti a jeho zpětné čtení. Například:

    XMFLOAT4A t;
    XMStoreFloat4A( &t, v );
    // t.x, t.y, t.z, and t.w can be individually accessed now
    
  • Nejúčinnější formou zpracování vektorů je použít streamování paměti do paměti, kde se vstupní data načítají z paměti (pomocí funkce Vector Load Functions), zpracují se plně ve formátu SIMD a pak se zapíšou do paměti (pomocí funkcí Vector Store functions).

Průvodce programováním DirectXMath