Capitolul 1 - Dispozitiv de Direct3D

dispozitiv de Direct3D

Există trei constructori care pot fi folosite pentru a crea dispozitivul. Noi folosim acum unul dintre ei, și de a face cunoștință cu alte persoane în următoarele capitole. Cel pe care ne vom concentra, primește următoarele argumente:

Ce fac toate aceste opțiuni și cum să le folosească? Ei bine, primul argument, adaptor. ukazyvaaet un dispozitiv fizic va fi instanta a clasei. Fiecare dispozitiv din computer are un identificator unic (de obicei, în intervalul de la 0 la un număr unu mai mic decât numărul de dispozitive disponibile). Valoarea 0 corespunde unui dispozitiv care este utilizat în mod implicit.

DEVICES constructor supraincarcate
Al doilea dispozitiv constructor de suprasarcină identic cu primul, cu excepția parametrului renderWindow. care primește valoarea de tip IntPtr negestionate (care nu sunt legate de Windows Forms) fereastra. Ultimul constructor supraîncărcat are un singur tip de valoare IntPtr. este un indicator negestionat COM-interfață IDirect3DDevice9. Ele pot fi utilizate în cazul în care aveți nevoie pentru a lucra cu aplicatii negestionate din codul gestionat.

DISPOZITIVE emulare Software
Vă rugăm să rețineți că sub-rasterizerul vine numai cu SDK-ul DirectX, DirectX și biblioteca de execuție timp nu oferă această posibilitate. Ultima valoare, DeviceType.Software. Aceasta înseamnă că utilizați propriul software de rasterizare. Dacă nu sunteți sigur dacă aveți un software de rasterizare, ignorați această opțiune.

Argumentul RenderWindow leagă fereastra cu acest aparat. Ca Windows Forms clase de control conține un mâner fereastră, utilizați pur și simplu clasa derivată ca fereastra noastră de vizualizare. În acest parametru, puteți specifica forma panoului, sau orice altă clasă care moștenește de la control. Acum vom folosi formularul.

Ultimul parametru de constructor, presentationParameters. Acesta controlează modul în care aparatul afișează datele de pe ecran. Prin această clasă puteți controla orice parametri de dispozitiv de afișare. Mai târziu vom vorbi cu mai multe detalii despre structura, iar acum va plăti doar pentru membrii vinmanie și SwapEffect cu ferestre.

membru windowed este o variabilă logică, determinarea dacă dispozitivul funcționează în modul ecran complet modul (fals) sau într-o fereastră (adevărat).

Acum, având aceste informații, putem configura dispozitivul. Să ne întoarcem la codul și fă-o. În primul rând, avem nevoie de un obiect dispozitiv pe care îl vom utiliza în aplicația noastră. Vom adăuga un nou membru al dispozitivului interior. Se introduce următoarea linie la definiția de clasă:

Acum să adăugați la clasa noastră o funcție nouă numită InitializeGraphics. în cazul în care putem folosi un constructor care tocmai a discutat. Adăugați la clasa următorul cod:

După cum puteți vedea, vom crea un argument cu setările de afișare, a stabilit termenii menționați mai sus (și SwapEffect cu ferestre), și apoi să creați dispozitivul. Așa cum am punctul adaptor ID 0, ceea ce înseamnă că adaptorul implicit. Creăm un dispozitiv hardware, și nu o filială sau un software de rasterizare. Notă utilizarea acestui cuvânt cheie ca o fereastră de vizualizare. Deoarece cererea noastră și, în special, această clasă este un formular pentru Windows, ne-am folosi. În plus, după cum am menționat mai devreme, am loc de procesare vertex pe CPU. Totul este bine, dar pentru moment acest cod nu este numit, așa că hai să schimbăm funcția principală a clasei noastre, așa că a apelat la această metodă. Efectuați următoarele modificări la o metodă statică principal creat implicit:

La funcția, am făcut câteva modificări. În primul rând, am adăugat, utilizând instrucțiunile din operatorul de a crea un formular. Acest lucru asigură că formularul nostru va fi disponibilă atunci când aplicația părăsește domeniul de aplicare al blocului. Apoi am adăugat o comandă pentru a arata forma. Prin aceasta ne asigurăm că fereastra este foarte încărcată și afișată (și, prin urmare, mânerul ferestrei va fi configurat) înainte de a încerca să creeze dispozitivul. Apoi, noi numim funcția noastră, efectuarea unui dispozitiv și de a folosi metoda Run standard pentru a rula aplicația. Compilați aplicația și rulați-l. Felicitări, ați creat doar cu succes prima dvs. Direct3D aplicație.

Ei bine, trebuie recunoscut faptul că cererea este extrem de plictisitoare. Acesta creează dispozitivul, dar nu face nimic cu ea, astfel că, prin uita la aplicația care rulează nu va observa nicio diferență de stabilit la începutul „# proiectului gol» C. Să schimbăm acest lucru și ceva de a vizualiza pe ecran.

Formăm clase au construit-in capacitatea de a determina atunci când au nevoie să se vopsi: utilizarea metodei supracomandată OnPaint (sau eveniment interceptarea Paint). Acest eveniment are loc de fiecare dată când fereastra trebuie revopsite. Aceasta pare a fi locația perfectă pentru codul nostru de redare. Noi nu vom face nimic uimitor, ci pur și simplu debifați caseta de selectare, golful său specificat de culoare. Adăugați la definirea clasa următorul cod:

Pentru continuă specificate fereastra de umplere de culoare, folosim metoda clară a dispozitivului. Noi folosim acum una dintre culorile predefinite cu CornflowerBlue numele (albăstrea). Primul parametru al metodei indică ceea ce vrem să curețe; În acest exemplu, vom purifica fereastra țintă. Cu alți membri ai ClearFlags de enumerare vom introduce mai târziu. A doua opțiune - este utilizat pentru tratamentul de culoare, iar cei doi parametri rămași până când nu sunt importante pentru noi. Odată ce dispozitivul este șters, trebuie să actualizați imaginea de pe ecranul monitorului. Aceasta face ca metoda actuală. Există mai multe versiuni supraîncărcate ale acestei metode; prezentat aici actualizează întreaga zonă a dispozitivului. Restul de suprasarcină, vom discuta mai târziu.

Rularea aplicației acum, veți observa că fundalul ferestrei este albăstrea. Puteți redimensiona sau maximiza fereastra pentru a umple ecranul, și de fiecare dată când face acest lucru, suprafața ferestrei este umplut cu albastru albăstrea. Acum putem vedea modul în care dispozitivul nostru este de a face ceva, dar rezultatul este încă destul de plictisitor. Același rezultat poate fi atins prin stabilirea culorii de fond a formei în mediul de dezvoltare. Este necesar să se atragă ceva mai impresionant.

Obiectul principal al graficii tridimensionale desenate, este un triunghi. Un număr suficient de triunghiuri vă permite să trimiteți orice, inclusiv suprafețele curbe netede. Deci, este destul de firesc ca primul nostru model ar trebui să fie triunghi separat. Pentru a simplifica procesul de desen acestui triunghi, nu va trebui să vă faceți griji despre lucruri, cum ar fi „spațiul cosmic“ sau „transformare“ (aceste subiecte despre care veți afla în scurt timp), și desena un triunghi folosind coordonatele ecran. Deci, pentru a desena triunghiul nostru minunat, două lucruri sunt necesare. În primul rând, avem nevoie de un fel de structuri de date, în cazul în care informațiile vor fi stocate pe triunghiul. În al doilea rând, este necesar să se informeze dispozitivul pe care este necesar să se elaboreze un triunghi.

Din fericire, în DirectX pentru cod gestionat au deja proiectarea pentru stocarea de date triunghiuri. Aceasta clasa CustomVertex în spațiul de nume Direct3D. adăpostit multe de proiectare utilizate în mod obișnuit de format vârf. utilizate în Direct3D. Structura stochează date în format nod într-un format care Direct3D înțelege și se poate utiliza. Mai târziu, vom discuta mai în detaliu structura, iar acum pentru structura noastră triunghi alege TransformedColored. Ea spune Direct3D, că triunghiul nostru nu este necesar pentru a converti (de exemplu, roti sau muta), deoarece vom specifica locația în coordonate ecran. De asemenea, pentru fiecare punct (vertex) al triunghiului este pe componenta de culoare. Înapoi la metoda noastră supracomandată OnPaint. și adăugați următorul cod după dispozitiv de apel de compensare:

Fiecare membru al matrice este creat un singur punct al triunghiului nostru, deci trebuie să fie de trei elemente. Apoi, pentru fiecare membru al matrice, atribuim structura proprietății Poziția Vector4. Amplasarea nodurilor transformate includ coordonatele X și Y în spațiul ecranului (în raport cu originea ferestrei), iar Z coordona valoarea și rhw (sau w inversă omogen). Ultimele doi termeni din acest exemplu sunt ignorate. Structura Vector4 este foarte convenabil pentru stocarea acestor informații. Apoi ne-am stabilit culorile fiecăruia dintre nodurile. Rețineți că, atunci când se utilizează culorile standard nevoie pentru a apela o metodă ToArgb. Direct3D se așteaptă ca culorile vor fi prezentate sub formă de numere întregi pe 32 de biți, iar această metodă transformă culoarea disponibilă în acest format.

Rețineți că în determinarea coordonatele triunghiului folosește lățimea actuală și înălțimea ferestrei. Acest lucru se face la schimbările de dimensiune triunghi cu fereastra.

Acum avem datele și nevoia de a spune Direct3D că vrem să atragă triunghiul nostru, și cum să-l atragă. Acest lucru se face prin adăugarea unei OnPaint metodă supraîncărcat următorul cod:

Ce naiba înseamnă toate astea? Nu-ți face griji, totul este relativ simplu. Metoda BeginScene permite Direct3D știu că vom face ceva pentru a trage, și să se pregătească pentru ea. Acum, când am spus Direct3D, că vom desena ceva, trebuie să spunem ce vom trage. Pentru acest scop VertexFormat proprietate. Se spune Direct3D, care este format de conducte funcție fixă ​​dorim să folosim. În cazul nostru, vom folosi conducta pentru a converti și a nodurilor colorate. Nu vă faceți griji dacă nu înțelegi până când cuvântul „conducte funcție fixă,“ vom vorbi despre asta mai târziu.

În DrawUserPrimitives funcție este de fapt desen. Deci, ce se înțelege prin parametrii? Prima opțiune - este de tip primitiv, pe care ne-am propus să atragă. Există mai multe tipuri diferite, dar acum vrem doar pentru a desena o listă de triunghi, asa ca alege tipul TriangleList. A doua opțiune - acesta este modul în care vom desena triunghiuri; pentru o listă de triunghiuri acest număr ar trebui să fie întotdeauna egal cu numărul de noduri din matrice, împărțit la trei. Așa cum am trage un triunghi, bineînțeles, aici punctul 1. Ultimul parametru al funcției - este datele pe care Direct3D este utilizat pentru a desena un triunghi. Am creat deja o serie de date, astfel încât rămâne să sublinieze aici. Această din urmă metodă, EndScene. pur și simplu spune Direct3D, nu vom trage mai. După fiecare apel, trebuie să apelați BeginScene EndScene.

Acum, compila și rula noua noastră aplicație. Vă rugăm să rețineți că există un triunghi de culoare pe un fond colorat. Este important de remarcat faptul că culoarea de vârfuri ale triunghiului - acestea sunt culorile pe care le-am stabilit în codul, dar în interiorul triunghiului de culoare sunt amestecate unul cu altul. Direct3D interpolarea automat culorile de pe suprafața triunghiului. Încercați să schimbe culoarea mea selectate și a vedea ce efect ar avea.

Oh, se pare că am rupt cererea noastră! Lansarea sa ne arată un ecran negru, care, uneori, fulgeră triunghi nostru. Atunci când fereastra este redimensionată, acest efect este mai pronunțat. Acest lucru este rău, dar ce sa întâmplat? Faptul că Windows încearcă să fie inteligent și redesenează forma actuală (o avem gol), după ce fereastra este invalidat. Ea trece prin zugrăvirea nostru metoda OnPaint suprascris. Corectați situația pur și simplu prin schimbarea stilului ferestrei create. În constructor formularul dumneavoastră înlocui TODO skektsiyu pe linia următoare:

Acum, totul funcționează cum era de așteptat, atunci când aplicația pornește. Am raportat fereastra, întregul revopsire ar trebui să aibă loc în cadrul metodei supracomandată OnPaint (WmPaint Win32 este un mesaj normal) și fereastra noastră este opac. Acest lucru înseamnă că nu va fi nici un desen pe fereastră, și tot ceea ce se întâmplă depinde de noi. De asemenea, puteți să rețineți că dacă modificați dimensiunea ferestrei, astfel încât nu va fi client zona vizibilă, atunci va arunca o excepție. Dacă într-adevăr vă deranjează, aveți posibilitatea să modificați parametrul care determină dimensiunile minime ale matriței.