0% au considerat acest document util (0 voturi)
27 vizualizări37 pagini

DirectX Cap3

Documentul prezintă pașii pentru desenarea graficii 3D în DirectX, inclusiv definirea formatului de vârfuri, crearea bufferului de vârfuri, setarea matricilor și desenarea primitivelor.

Încărcat de

Roxana Ioana
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
27 vizualizări37 pagini

DirectX Cap3

Documentul prezintă pașii pentru desenarea graficii 3D în DirectX, inclusiv definirea formatului de vârfuri, crearea bufferului de vârfuri, setarea matricilor și desenarea primitivelor.

Încărcat de

Roxana Ioana
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Rodica Baciu

Programarea aplicațiilor multimedia cu


DirectX
Cap.3 - Grafica 3D

ISBN: 978-606-616-084-1
Cuprins

• Cum definim vârfuri 3D utilizând buffer-ul de


vârfuri
• FVF (flexible vertex formats) - formatul de
vârfuri flexibil
• Cum setăm stream-urile
• Cum desenăm primitive ca triunghiuri, linii
• Cum setăm matricele pentru vizualizare,
proiecţie şi transformări geometrice
• Cum animăm obiectele
• Cum lucrăm cu primitive indexate
Rodica Baciu Programarea aplicațiilor 2
multimedia cu DirectX
Paşii pentru redarea unei primitive

1. Crearea şi definirea formatului vârfurilor


2. Crearea obiectului de tip buffer de vârfuri
3. La fiecare cadru:
– Setarea matricelor pentru vizualizare, proiecţie
şi transformări geometrice
– Setarea sursei pentru stream
– Setarea FVF
– Desenează una sau mai multe primitive
4. Distrugerea obiectului buffer de vârfuri
Rodica Baciu Programarea aplicațiilor 3
multimedia cu DirectX
Pasul1 - Crearea şi definirea formatului vârfurilor
1. Structura pentru un vârf poate conţine diferite
informaţii:
– Coordonatele vârfurilor
– Date despre culoare
– Date pentru iluminare
– Coordonate de texturare

EXEMPLU:

2. Deoarece Direct3D nu poate prevedea datele pe


care le vom memora în vârfuri trebuie să-i spunem
formatul exact al vârfurilor.
Rodica Baciu Programarea aplicațiilor 4
multimedia cu DirectX
Definirea vârfurilor

EXEMPLU:

Rodica Baciu Programarea aplicațiilor 5


multimedia cu DirectX
Formatul de vârfuri flexibil FVF
1. Pentru a transmite spre Direct3D formatul
vârfurilor este nevoie de descriptorul FVF
2. FVF este o valoare DWORD care păstrează
o combinaţie de constante simbolice care
specifică ce informaţii se păstrează în
structura pentru vârfuri

EXEMPLU:

Rodica Baciu Programarea aplicațiilor 6


multimedia cu DirectX
FVF - Constante pentru descriptorul FVF
Coordonatele vârfului neafectate de
D3DFVF_XYZ transformări. În structura noastră corespunde
FLOAT X, Y, Z
D3DFVF_NORMAL Normala în vârf. În structura noastră
corespunde
D3DFVF_DIFFUSE FLOAT X, Y, Z

Componenta difuză a culorii. În structura


D3DFVF_SPECULAR noastră corespunde
FLOAT COLOR

D3DFVF_TEX0 – D3DFVF_TEX7 Componenta speculară a culorii. În


structura noastră corespunde
FLOAT COLOR
D3DFVF_XYZRHW
Coordonatele de texturare. În
Vertexul nu poate fi iluminat sau transformat. structura noastră corespunde
Informaţia de poziţie este exprimată în coordonate FLOAT TEXTURE
de dispozitiv (în pixeli în cazul nostru)

Rodica Baciu Programarea aplicațiilor 7


multimedia cu DirectX
Pasul 2 - Crearea obiectului de tip buffer de vârfuri
[in] Dimensiunea în octeţi a buffer-ului.
Va fi ceva de tipul sizeof(CUSTOMVERTEX)*N

[in] Transmiteţi 0

[in] Descriptorul FVF. Acesta ii


va spune Direct3D cum sunt
structurate vârfurile. Se
transmite constanta DWORD
definită anterior.
[in] Locul unde se creează obiectul.
[in, out] Adresa unde se returnează
pointerul spre obiect. Se poate folosi
tipul LPDIRECT3DVERTEXBUFFER9.

[in] Valoare rezervată. Transmiteţi NULL.

Rodica Baciu Programarea aplicațiilor 8


multimedia cu DirectX
Crearea obiectului de tip buffer de vârfuri
Exemplu
• Pointerii spre IDirect3DVertexBuffer9
pot fi scrişi fie ca
IDirect3DVertexBuffer9*, sau puteţi
utiliza LPDIRECT3DVERTEXBUFFER9.
Exemplu pentru un triunghi:

Rodica Baciu Programarea aplicațiilor 9


multimedia cu DirectX
Observaţii
• Funcţia nu a cerut un pointer spre tabloul cu
datele despre vârfuri.
• Buffer-ul de vârfuri este creat gol aşa cum şi
o suprafaţă s-a creat fără conţinut, dar cu
dimensiunile corespunzătoare datelor pe
care vrem să i le introducem.
• Practic, nu s-a obţinut buffer-ul ci un obiect
ale cărui metode şi buffer-e le putem utiliza.

Rodica Baciu Programarea aplicațiilor 10


multimedia cu DirectX
Scrierea în buffer-ul de vârfuri

• Pentru a copia date în buffer-ul de


vârfuri este nevoie să-l blocăm
(metoda Lock). Aceasta dă un pointer
spre o zonă de memorie unde pot fi
copiate vârfurile.
• Apoi se face copierea (funcţia
memcpy) vârfurilor în zona respectivă.
• La sfârşit se deblochează (metoda
Unlock) buffer-ul de vârfuri.
Rodica Baciu Programarea aplicațiilor 11
multimedia cu DirectX
Scrierea în buffer-ul de vârfuri - metoda Lock
[in] Offset faţă de începutul buffer-ului (în
octeţi) de unde se începe blocarea. Pentru a
bloca întreg buffer-ul transmiteţi 0.
[in] Dimensiunea în octeţi care se
blochează pentru modificare. Pentru a
modifica întreg buffer-ul transmiteţi 0.

[in, out] Adresa unui pointer unde se


primeşte pointerul spre buffer. Aici se
vor copia vârfurile.

[in] Se indică comportarea buffer-ului


de vârfuri. De exemplu, modul de
acces al buffer-ului poate fi read-only,
write, etc. De obicei se va transmite 0
pentru această valoare.
Exemplu:

Rodica Baciu Programarea aplicațiilor 12


multimedia cu DirectX
Scrierea în buffer-ul de vârfuri–funcţia memcpy

[in, out] Destinaţia octeţilor copiaţi.

[in] Sursa octeţilor.

[in] Numărul de octeţi copiaţi.


Exemplu:

Rodica Baciu Programarea aplicațiilor 13


multimedia cu DirectX
Pasul 3

1. Crearea şi definirea formatului vârfurilor

2. Crearea obiectului de tip buffer de vârfuri
3. La fiecare cadru (în bucla de redare a
aplicaţiei): ?
A. Setarea matricilor pentru vizualizare, proiecţie şi
transformări geometrice
B. Setarea sursei pentru stream
C. Setarea FVF
D. Desenează una sau mai multe primitive
4. Distrugerea obiectului buffer de vârfuri ?

Rodica Baciu Programarea aplicațiilor 14


multimedia cu DirectX
A. Setarea matricilor

1. Matricea pentru transformări geometrice


(de modelare)
2. Matricea de vizualizare
3. Matricea de proiecţie

Rodica Baciu Programarea aplicațiilor 15


multimedia cu DirectX
Matricea pentru transformări geometrice

După ce creaţi o matrice nu uitaţi să o iniţializaţi ca matrice


identitate:

Dacă matricea de transformare se modifică în timp, obiectul


va fi animat.
Odată obţinută matricea de transformare trebuie “anunţat”
sistemul folosind metoda SetTransform a dispozitivului
IDirect3DDevice9.
Rodica Baciu Programarea aplicațiilor 16
multimedia cu DirectX
Metoda SetTransform
[in] Reprezintă tipul matricei setate.
Această valoare poate fi:

[in] Pointer spre matricea pe


care o înregistrăm

Exemplu:

Rodica Baciu Programarea aplicațiilor 17


multimedia cu DirectX
Matricea de vizualizare
Matricea de vizualizare poate fi construită manual sau pe
baza funcţiilor Direct3D

[in, out] Adresa unde se va returna


matricea de vizualizare

[in] Poziţia camerei

[in] Punctul spre care “se uită”


camera

[in] Un vector indicând direcţia axei Y


Exemplu:

Rodica Baciu Programarea aplicațiilor 18


multimedia cu DirectX
Matricea de proiecţie
Matricea de proiecţie ne asigură că ceea ce se vede
dinspre cameră apare corect pe fereastra de vizualizare.

[in, out] Adresa unde se va returna


matricea de proiecţie

[in] Deschiderea unghiului de


vizualizare. De obicei D3DX_PI/4

[in] Rata de aspect a ferestrei width/height

[in] Planul apropiat. De obicei 1.


Exemplu:
[in] Planul îndepărtat.

Rodica Baciu Programarea aplicațiilor 19


multimedia cu DirectX
B. Setarea sursei pentru stream
• Un stream Direct3D este un canal de
informaţii.
• Direct3D are câteva stream-uri numerotate de
la 0.
• Pentru a-i spune lui Direct3D care vârfuri să le
redea le conectăm la un stream.
“Hey Direct3D, I have some vertices to draw
and you’ll find them waiting in Channel 1.”
• Pentru a conecta buffer-ul de vârfuri la un
stream apelăm metoda SetStreamSource din
IDirect3DDevice9.

Rodica Baciu Programarea aplicațiilor 20


multimedia cu DirectX
Metoda SetStreamSource
[in] Numărul stream-ului. Pentru
primul stream se va da 0.

[in] Pointer-ul buffer-ului la care se


conectează stream-ul.

[in] Offset faţă de începutul stream-ului.


Pentru a începe cu primul octet se dă 0.

[in] Dimensiunea în octeţi a unui vârf. Va fi


ceva de forma sizeof(CUSTOMVERTEX)

Exemplu:

Rodica Baciu Programarea aplicațiilor 21


multimedia cu DirectX
C. Setarea FVF -
Metoda SetFVF a lui
IDirect3DDevice9
Înainte ca Direct3D să poată reda primitiva trebuie să-i transmitem FVF
pentru ca Direct3D să poată “înţelege” vârfurile încărcate în stream.

Rodica Baciu Programarea aplicațiilor 22


multimedia cu DirectX
D. Desenează una sau mai multe primitive
[in] Tipul primitivei care se
desenează.

[in] Primul vertex din stream-ul


utilizat pentru redare. 0 de obicei.

[in] Numărul primitivelor de desenat


utilizând vertex-urile din stream.
1 pentru o primitivă.
Rodica Baciu Programarea aplicațiilor 23
multimedia cu DirectX
Exemplu de
Trebuie definită
afişare a unui
triunghi

Rodica Baciu Programarea aplicațiilor 24


multimedia cu DirectX
Exemplu de
afişare a unui
triunghi-
continuare

Rodica Baciu Programarea aplicațiilor 25


multimedia cu DirectX
Cum animăm obiectele
• Pentru aceasta, la fiecare cadru se
modifică matricea de modelare.
• Spre exemplu dacă vrem să rotim
triunghiul folosim metoda
D3DXMatrixRotationY pentru a construi
matricea de rotaţie. Această matrice va fi
recalculată pentru unghiuri diferite, la
fiecare cadru.

Rodica Baciu Programarea aplicațiilor 26


multimedia cu DirectX
Cum desenăm diverse obiecte în Direct3D

Colecţie de mai multe puncte

Colecţie de mai multe linii

Construite pe
Colecţie de mai multe linii conectate
baza
între ele
Obiecte primitivelor Triangle list –D3DPT_TRIANGLELIST
afişate de Direct3D
Colecţie de mai multe triunghiuri
Direct3D
Colecţie de mai multe triunghiuri
conectate între ele printr-o muchie

Colecţie de mai multe triunghiuri care


au un vârf şi câte o latură comune
Importate din pachete •3D Studio MAX
de modelare 3D ca •Maya
mesh
•Softimage
Rodica Baciu Programarea aplicațiilor 27
multimedia cu DirectX
Primitive indexate

• Sunt o optimizare a primitivelor standard.


• Oferă eficienţă

Rodica Baciu Programarea aplicațiilor 28


multimedia cu DirectX
Primitive indexate
• Primitivele indexate folosesc în continuare FVF şi buffer-ul de vârfuri.
• Buffer-ul de vârfuri este folosit ca un simplu loc de stocare a vârfurilor. El
va stoca toate vârfurile primitivelor, dar vârfurile nu vor fi aşezate într-o
ordine anume. Ordinea vârfurilor în buffer-ul de vârfuri nu are legătură cu
ordinea desenării lor.
• În buffer nu se vor stoca vârfurile decât o dată. Deci fiecare vârf din buffer
va fi unic.
• Pentru a defini ordinea aranjării vârfurilor avem nevoie de un buffer
separat numit buffer de indecşi. Acesta este reprezentat de interfaţa
Direct3DIndexBuffer9 interface.

V1 V2
V1

V3
V0 V3
Rodica Baciu Programarea aplicațiilor 29
multimedia cu DirectX
Buffer-ul de indecşi
• Fiecare element din buffer-ul de indecşi este un offset în buffer-ul de
vertecşi. Adică fiecare element al său indică spre un vârf.
• Buffer-ul de indecşi se referă la vârfurile din buffer-ul de vârfuri prin offset-
urile lor.
• Exemplu:
– Pentru primul triunghi: 0, 1, 3
– Pentru al doilea triunghi: 1, 2, 3
• Buffer-ul de indecşi se creează cu metoda CreateIndexBuffer din
IDirect3DDevice9.
• Când se copiază în buffer-ul de indecşi trebuie blocat.

V1 V2
V1

V3
Rodica Baciu Programarea aplicațiilor V0 V3 30
multimedia cu DirectX
Metoda CreateIndexBuffer
[in] Dimensiunea în octeţi a buffer-
ului de indecşi. Pentru un
dreptunghi fiind necesare 6 vârfuri
va fi sizeof(short)*6

[in] transmiteţi 0

[in] Poate fi fie D3DFMT_INDEX16


fie D3DFMT_INDEX32. De cele mai
multe ori se va da
D3DFMT_INDEX16.

[in] Zona de memorie unde se


[in] Valoare rezervată. creează buffer-ul de indecşi.
Transmiteţi NULL De cele mai multe ori se va
da D3DPOOL_DEFAULT.
[in, out] Pointer-ul buffer-ului de
indecşi returnat de metodă.
Rodica Baciu Programarea aplicațiilor 31
multimedia cu DirectX
V0, 0
V2, 1
V1, 2
V3, 3

Exemplu de desenare a
unui dreptunghi

Rodica Baciu Programarea aplicațiilor 32


multimedia cu DirectX
Exemplu de desenare a
unui dreptunghi
-continuare
V0, V2, V1
V3, V2, V0

Rodica Baciu Programarea aplicațiilor 33


multimedia cu DirectX
Desenarea primitivelor indexate
• După crearea buffer-ului de vârfuri şi a buffer-
ului de indecşi se poate desena primitiva.
• Desenarea se va face în bucla de mesaje.
• Se vor seta stream-ul şi FVF, ca şi la
primitivele standard.
• Ceea ce diferă de primitivele standard:
– Apelarea metodei SetIndices din
IDirect3DDevice9
– Desenarea se face cu metoda
DrawIndexedPrimitive nu cu metoda
DrawPrimitive
Rodica Baciu Programarea aplicațiilor 34
multimedia cu DirectX
Metoda SetIndices din
IDirect3DDevice9

[in] Pointer la buffer-ului de


indecşi folosit pentru redare.

Rodica Baciu Programarea aplicațiilor 35


multimedia cu DirectX
Metoda DrawIndexedPrimitive
[in] Tipul primitivei care se
desenează. Aceleaşi tipuri
ca la primitivele standard.

[in] Vertexul cu care se începe


redarea. 0 de obicei.

[in] Index-ul minim pe care-l


folosim. 0 de obicei.

[in] Numărul maxim de vârfuri


pe care le utilizăm. Pentru un
dreptunghi este 4.

[in] Poziţia din buffer-ul de


indecşi de unde începe citirea
vârfurilor. 0 de obicei.

[in] Numărul primitivelor de


desenat utilizând vertex-urile din
stream. 1 pentru o primitivă.
Rodica Baciu Programarea aplicațiilor 36
multimedia cu DirectX
Exemplu de
desenare a
unui
dreptunghi-
continuare

Rodica Baciu Programarea aplicațiilor 37


multimedia cu DirectX

S-ar putea să vă placă și