1. fejezet - A készülék direct3d
Direct3D eszköz
Három konstruktőrök, hogy lehet használni, hogy megteremtse a készüléket. Most használni az egyiket, és ismerje meg másokat a következő fejezetek. Az egyik, amikor arra fogunk koncentrálni, megkapja a következő érveket:
Mit mindezen lehetőségeket, és hogyan kell használni őket? Nos, az első érv, adapter. ukazyvaaet egy fizikai eszköz lesz a például az osztály. Minden eszközt a számítógép rendelkezik egy egyedi azonosítóval (általában a 0-tól a szám egy kisebb a rendelkezésre álló eszközök). A 0 érték felel meg az eszköz által használt alapértelmezett.
Túlterhelt kivitelező ESZKÖZÖK
A második kivitelező túlterhelés azonos az elsővel, kivéve paraméter renderWindow. amely megkapja a típusú érték IntPtr felügyelt (nem kapcsolódik a Windows Forms) ablakot. Utolsó túlterhelt konstruktora veszi egyetlen érték IntPtr típusát. egy nem-menedzselt COM-interfész mutató IDirect3DDevice9. Ezeket fel lehet használni, ha kell dolgozni menedzselt alkalmazások a menedzselt kód.
Szoftveremuláció ESZKÖZÖK
Felhívjuk figyelmét, hogy al-raszterizáló csak jön az SDK DirectX DirectX és futási időben könyvtár nem kínál ez a lehetőség. Az utolsó érték, DeviceType.Software. Ez azt jelenti, hogy Ön használja a saját szoftver raszterez. Ha nem biztos abban, hogy van-e olyan szoftver raszterezőt, hagyja figyelmen kívül ezt a lehetőséget.
RenderWindow érv kötődik az ablak ezzel a készülékkel. Mivel a Windows Forms vezérlő osztályok tartalmaznak kilincs, egyszerűen használja a származtatott osztály, mint a mi megjelenítés ablakot. Ebben a paraméterben megadhatja az alak a panel, vagy bármely más osztály, amely örökli a vezérlés. Most fogjuk használni az űrlapot.
Az utolsó paraméter kivitelező, presentationParameters. Ez szabályozza, hogy a készülék adatokat jeleníti meg a képernyőn. Ezzel osztály beállítható minden megjelenítő eszköz paramétereit. Később majd beszélünk részletesebben a szerkezet, és most fizetni, és csak a tagok vinmanie ablakos és SwapEffect.
Ablakos tag egy logikai változó, annak meghatározására, hogy a készülék működik teljes képernyős módban (hamis) módban, vagy egy ablak (igaz).
Most, miután ezt az információt, akkor a készülék beállítása. Térjünk vissza a kódot, és csinálni. Először is, szükségünk van egy eszköz tárgyat hogy fel fogjuk használni a honlapunkon. Mi lesz hozzá egy új tagja a beltéri készülék. Helyezze be a következő sort az osztály definíciója:
Most adjuk hozzá a mi osztály egy új funkció az úgynevezett InitializeGraphics. ahol fel tudjuk használni a kivitelező, hogy csak tárgyalt. Hozzáadás az osztály a következő kódot:
Mint látható, hozunk létre egy érv a képernyő beállításait, meg a feltételeket a fent említett (ablakos és SwapEffect), majd hozza létre az eszköz. Ahogy a pont adapter ID 0, ami azt jelenti, az alapértelmezett adaptert. Készítünk egy hardvereszköz, és nem leányvállalat vagy egy szoftver raszterez. Figyeljük meg az erre a kulcsszóra vizualizációs ablakot. Mivel a kérelmet, és különösen, ez az osztály egy Windows Form, csak használja azt. Ezen kívül, mint már korábban említettük, helyezzük vertex feldolgozó a CPU. Minden rendben van, de most ez a kód nem hívott, úgyhogy változtatni a fő funkciója az osztály, így ő fordult ezzel a módszerrel. Végezze el a következő módosításokat statikus Fő módszer alapértelmezésben létrehozásra kerül:
A funkció, tettünk egy pár változás. Először is, van hozzá az utasításokat az üzemeltető, hogy hozzon létre egy űrlapot. Ez biztosítja, hogy formában lesz elérhető, ha a kérelem elhagyja a körét a blokk. Aztán hozzá egy parancsot, hogy alkotnak. Ezzel biztosítjuk, hogy az ablak igazán betöltődik és megjelenik (és ezért a kilincs jön létre), mielőtt megpróbáljuk létrehozni a készüléket. Akkor hívjuk a függvényt, végző készülékkel, és a standard Futtatás módszer az alkalmazás futtatásához. Fordítsuk le a programot és futtatni. Gratulálunk, csak sikeresen létrehozta az első Direct3D alkalmazás.
Nos, el kell ismerni, hogy az alkalmazás rendkívül unalmas. Ez megteremti a készüléket, de nem csinál semmit vele, úgy, hogy megnézi a futó alkalmazás nem fogja észrevenni a különbségeket elején alakult az „üres» C # projekt. Változtassuk meg ezt, és valami láthatóvá a képernyőn.
Alkotunk osztályok beépített képes meghatározni, mikor kell átfestés magát: a használata a felülírt módszer OnPaint (vagy festék esetén elfogás). Ez az esemény mindig bekövetkezik az ablakot kell festeni. Úgy tűnik, ez a tökéletes hely a megjelenítési kód. Mi nem fog csinálni semmit, hihetetlen, hanem egyszerűen törölje a jelölőnégyzetet, az öböl megadott színnel. Hozzá meghatározása az osztály az alábbi kódot:
Folyamatos ablak meghatározott kitöltési színét, használjuk a Clear módszer a készülék. Most használja az előre definiált színek nevét CornflowerBlue (búzavirág). Az első paraméter a módszer azt jelzi, hogy mit akarunk, hogy tisztítsák meg; Ebben a példában azt tisztítják a cél ablakot. A többi tagját a felsorolás ClearFlags fogjuk be később. A második lehetőség - használják a szín kezelésére, és a fennmaradó két paraméter, amíg meg nem fontosak számunkra. Ha a készülék nincs bejelölve, akkor frissíteni kell a képet a képernyőn. Lehetővé teszi, hogy a módszer. Számos túlterhelt változatai ezt a módszert; Az itt bemutatott frissíti az egész terület a készüléket. A többi túlterhelés, megbeszéljük később.
Az alkalmazás futtatása most, akkor észrevehetjük, hogy a háttérben az ablak búzavirág. Átméretezése vagy maximalizálja az ablakot, hogy kitöltse a képernyőt, és minden egyes alkalommal, amikor ezt a felületet az ablak tele van búzavirágkék. Most már látjuk, hogyan eszköz csinál valamit, de az eredmény még mindig elég unalmas. Ugyanez az eredmény érhető el azáltal háttérszíne formájában a fejlesztési környezetben. Meg kell hívni valami lenyűgöző.
A fő célunk a rajzolt háromdimenziós grafika, egy háromszög. Elegendő számú háromszögek segítségével benyújtani bármit, beleértve a sima íves felületek. Így teljesen természetes, hogy az első minta külön kell háromszöget. A folyamat egyszerűsítése rajz a háromszög, akkor nem kell aggódnia a dolgokat, mint a „világűr” vagy „átalakítás” (ezek a témák akkor megtudjuk, rövidesen), és rajzoljon egy háromszöget a képernyő koordinátáit. Így hívják fel a csodálatos háromszög, két dolog szükséges. Először is, szükségünk van néhány olyan adatstruktúra, ahol az információ tárolásra kerül a háromszögre. Másodszor, meg kell, hogy tájékoztassa a készülék, hogy szükség van, hogy dolgozzon egy háromszöget.
Szerencsére a DirectX menedzselt kód már a tervezési adatok tárolására háromszög. Ez CustomVertex osztály a Direct3D névtérben. fedett sok általánosan használt design a vertex formátumban. használt Direct3D. A szerkezet a vertex formátumban tárolja az adatokat olyan formában, hogy Direct3D megérti és tudja használni. Később megbeszéljük részletesebben a szerkezet, és most a mi háromszög struktúra választani TransformedColored. Elmondja a Direct3D, hogy a háromszög nem szükséges átalakítani (azaz forgatni vagy mozgatni), mert meghatározza a helyét a képernyőn koordinátákat. Valamint, minden pont (vertex) A háromszög a színes komponenst. Visszatérve a felülírt eljárás OnPaint. és adja hozzá a következő kódot hívás után elszámolási eszköz:
Minden tagja a tömb jön létre egyetlen pontja a háromszög, ezért kell három elemet. Ezután minden egyes tagja a tömb, akkor rendelheti álláspont tulajdoni struktúra Vector4. Helye a transzformált csúcsok tartalmaz koordinátái X és Y a képernyőn térben (viszonyítva az eredete az ablak), és a Z koordináta értékét és RHW (vagy homogén fordított w). Az utolsó két tag ebben a példában nem veszi figyelembe. Vector4 szerkezete nagyon kényelmes említett információk tárolására. Aztán meg a színeket az egyes csúcsok. Megjegyezzük, hogy ha a szabványos színek kell hívni a módszer ToArgb. Direct3D elvárja, hogy a színek kerülnek bemutatásra formájában 32 bites egész, és ez a módszer átalakítja a szín áll rendelkezésre ebben a formátumban.
Figyeljük meg, hogy meghatározzuk a koordinátákat a háromszög használja a jelenlegi szélessége és magassága az ablakon. Ez úgy történik, hogy a háromszög mérete megváltozik az ablakot.
Most már az adatokat, és el kell mondanom, hogy a Direct3D szeretnénk felhívni a háromszög és hogyan kell felhívni rá. Ez úgy történik, hozzátéve, egy túlterhelt módszert OnPaint alábbi kódot:
Mi a fenét jelent ez az egész? Ne aggódj, minden relatív egyszerű. BeginScene a módszer lehetővé teszi a Direct3D tudom, hogy fogunk tenni valamit, hogy dolgozzon, és felkészülni rá. Most, amikor azt mondta a Direct3D, hogy mi fog rajzolni valamit, meg kell mondani, hogy mit fogunk rajzolni. Erre a tervezett VertexFormat tulajdonság. Azt mondja Direct3D, mely formátum fix funkciójú csővezeték akarjuk használni. A mi esetünkben a csővezetéket átalakítására és színes csúcsot. Ne aggódj, ha nem érted, amíg a „fix funkció csővezeték” fogunk beszélni később.
A DrawUserPrimitives funkció ténylegesen rajz. Tehát mit értünk paraméterekkel? Az első lehetőség - ez a primitív típus, amely terveink szerint dolgozzon. Számos különböző típusú, de most már csak azt kell felhívni a háromszög listát, úgy döntenek, hogy milyen típusú TriangleList. A második lehetőség - ez hogyan fogjuk hívni a háromszögek; listáját háromszögek azt a számot mindig egyenlő a csúcsok száma a tömbben, osztva három. Ahogy felhívni egy háromszög, persze, itt a pont 1. Az utolsó paraméter a függvény - az adatok, amelyek Direct3D használják, hogy dolgozzon egy háromszöget. Mi már létrehozott egy sor adatot, így továbbra is rámutatni itt. Az utóbbi módszer, EndScene. egyszerűen azt mondja Direct3D, akkor nem készít többé. Minden hívás után, fel kell hívnia BeginScene EndScene.
Most lefordítani és futtatni az új alkalmazás. Felhívjuk figyelmét, hogy volt egy színes háromszög színes háttérrel. Fontos megjegyezni, hogy a szín, a háromszög csúcsait - ezek a színek, hogy van beállítva a kódot, de a színes háromszög összekeverjük egymással. Direct3D automatikusan kiszámolja a színek a felszínen a háromszög. Próbálja meg megváltoztatni a színét kiválasztott rám és lásd milyen hatása is lenne.
Ó, úgy tűnik, hogy eltört a kérelmet! Elindítása mutat nekünk egy fekete képernyő, ami néha felvillant a háromszög. Amikor az ablak átméretezhető, ez a hatás még kifejezettebb. Ez rossz, de mi történt? Az a tény, hogy a Windows megpróbál, hogy okos és átrajzolja a jelenlegi formájában (mi ez üres), miután az ablak érvénytelenítik. Ez áthalad az újrafestés a felülírt módszer OnPaint. A helyzet javítására egyszerűen megváltoztatja a stílus az ablak jön létre. Az az űrlap kivitelező cserélje skektsiyu TODO a következő sort:
Most minden a várakozásoknak megfelelően működik, az alkalmazás indulásakor. Mi jelentett az ablak, az egész festési belül meg kell történnie a felülírt eljárás OnPaint (WmPaint Win32 egy normál üzenet), és mi ablakot átlátszatlan. Ez azt jelenti, hogy nem lesz rajz ki az ablakon, és mindent, ami történik rajtunk múlik. Azt is vegye figyelembe, hogy ha módosítja a az ablak méretét úgy, hogy nem lesz látható kliens területen, akkor fog dobni egy kivételt. Ha ez tényleg zavar, meg lehet változtatni a paraméter, amely meghatározza a minimális méreteit a penész.