Documente Academic
Documente Profesional
Documente Cultură
Grafica 3D pe calculator
(Suport de curs n baza Direct 3D)
Chiinu - 2014
INTRODUCERE ...............................................................................................................................................4
1.
2.
3.
4.
6.
7.
8.
INTRODUCERE
Tehnologia DirectX de la corporaia Microsoft practic reprezint un standard de instrumente
pentru programarea graficii, mai ales jocurilor, pentru platforma Windows. Mai mult de 90%
jocuri computerizate se scriu n limbajul C++ cu utilizarea bibliotecii DirectX. mpreun cu
apariia primului sistem de operare grafic puternic Windows 95, corporaia Microsoft elaboreaz
paralel bibliotecile multimedia, cu ajutorul crora pot fi elaborate diferite aplicaii grafice.
Primul pachet instrumental se numea Game SDK. El a aprut aproximativ n acel timp, cnd
Windows 95 cucerea piaa mondial. Pachetul Game SDK a fost bazat pe grafic de rastru, n
acel moment nc nu existau video plci grafice 3D puternice. Pachetul susinea i sunetul i
uniti de intrare. Un an dup asta apar una dup alta versiunile DirectX 2 i DirectX 3, in
componena lor prezint i biblioteca Direct3D. Dup apariia sistemului Windows 98 biblioteca
DirectX a fost completat cu versiunile 5 i 6. n anul 1999 apare DirectX 7, care a semnalat
epoca noua de jocuri computerizate 3D. Peste un an se lanseaz DirectX 8, dup ce devine
evident n baz crui instrumentar trebuie de elaborat aplicaii grafice sub SO Windows. La
mijlocul anului 2003 a fost lansat versiunea noua la momentul respectiv DirectX 9.
n capitolul 1 se descriu bazele programrii sub SO Windows, se creeaz aplicaia de tip
fereastr. Aplicaia creat permanent va fi dezvoltat pe parcursul studierii a materialului.
Capitolul 2 reprezint o introducere n biblioteca DirectX. Aici sunt enumerate componentele
acestei bibliotecii, sunt descrise pe scurt tehnologiile utilizate la crearea DirectX. Sunt prezentate
informaii despre , Direct3D, conceptul de creare a scenelor n Direct3D. n sfrit, este
descris instalarea DirectX 9 SDK pe calculator.
n capitolul 3 sunt expuse informaii cheie despre etapa iniial de utilizare a Direct3D
iniializarea Direct3D, crearea dispozitivului Direct3D i reglarea dispozitivelor.
n capitolul 4 ce creeaz i se afieaz pe ecran una din cele mai simple figuri un triunghi
simplu. Se folosete bufferul vertexurilor i conveierul de randare. Astfel se obin informaii
principale despre geometria scenei n Direct3D.
Capitolul 5 este consacrat matricelor. Matricele joac un rol foarte important n Direct3D.
n capitolul 6 este examinat afiarea pe ecran unui obiect tridimensional adevrat. Este expus
conceptul de indexare a vertexurilor.
n capitolul 7 este descris bufferul de adncime. Sortarea pixelilor dup distana pn la
observator iat pentru ce este necesar bufferul de adncime, se mai numete i Z-buffer.
Capitolul 8 conine informaii despre materiale i lumini. Sunt descrise modele de iluminare,
informaii despre surse de lumin, principiile de interaciune a materialului cu iluminarea
obiectului. Anume n baza acestor principii se construiete percepia culorilor de ctre
observator. Tot n capitolul acesta sunt cercetai i vectori normali, care se folosesc la calcularea
iluminrii.
n capitolul 9 sunt descrise bazele ale texturrii. Se examineaz metoda standard de suprapunerea
texturilor pe obiect.
Capitolul 10 continu tema capitolului precedent prin expunerea materialului despre
multitexturare.
4
n capitolul 11 se descrie afiare de texte. Afiarea textului pe ecran este foarte important pentru
diferite aplicaii (de exemplu, jocuri). la sfritul capitolului se discut modul de trecere de la
aplicaia tip fereastr la aplicaia tip ecranul plin (fullscreen).
n caseta Project Types selectm Visual C++ Projects, iar n caseta Templates Win 32
Project;
Aplicaia
fereastr 1
Coad
mesaje ap.1
Aplicaia
fereastr 2
Coad
evenimen.
Windows
Coad
mesaje ap.2
LPSTR lpCmdLine,
int nCmdShow)
Declararea tipului structurat WINDCLASSEX, care este necesar pentru descrierea clasei, arat
astfel:
typedef struct _WNDCLASSEX
{
UINT cbSize;
UINT style;
WINDPOC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackgroung;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;
windowsclass.cbSize=sizeof(WNDCLASSEX);
style conine combinaia flagurilor ce descriu stilul dorit al ferestrei. Combinarea se face
cu ajutorul operatorului sau pe bii "|". Completm cmpul style:
windowsclass.style=CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
Descriem flagurile utilizate (informaiile suplimentare pot fi luate din documentaia pentru Win
32):
CS_VREDRAW n cazul cnd se schimb nlimea ferestrei sau fereastra a fost deplasat,
CS_HREDRAW n cazul cnd se schimb limea ferestrei sau fereastra a fost deplasat,
propriu;
hCursor cmpul acesta rspunde de utilizarea cursorului. Dup utilizare cmpul acesta
este asemntor cu cel precedent hIcon. Se difer numele funciei care ncarc cursorul.
Vom scrie:
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
Putem s ncercm s colorm fundalul cu o alt culoare, totui pentru DirectX aceasta nu are
nici o nsemntate, fiindc pentru asta sunt definite mijloacele proprii. Totui mai descriem
cteva pensule de diferite culori:
hIconSm descriptorul pictogramei mici, care se afieaz pe bara de taskuri sau n antetul
ferestrei aplicaiei. Vom folosi pictograma standard. Pentru asta vom scrie:
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
windowsclass.cbClsExtra=0;
windowsclass.cbWndExtra=0;
windowsclass.hInstance=hinstance;
windowsclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
windowsclass.hCursor=LoadCursor(NULL, IDC_ARROW);
windowsclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
windowsclass.lpszMenuName=NULL;
windowsclass.lpszClassName=_T("WINDOWSCLASS");
windowsclass.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
Crem fereastra.
Dup ce am nregistrat clasa, putem s crem fereastra. Aceasta se face cu funcia
CreateWindowEx(), care are urmtorul antet:
HWND CreateWindowEx(
DWORD dwExStyle,
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWindParent,
HWND hMenu,
HINSTANCE hInstance,
LPVOID lpParam);
X, Y poziia iniial a colului stnga sus n pixeli. Se poate de indicat coordonatele prin
utilizarea flagului CW_USEDEFAULT, lsnd astfel valorile implicite. Vom folosi pentru X
valoarea 300, iar pentru Y valoare 150, setnd astfel coordonatele colului stnga sus n
pixeli;
nWidth i nHeight limea i respectiv nlimea ferestrei n pixeli. Se poate de folosit
valorile implicite cu ajutorul flagului CW_USEDEFAULT, sau de indicat valorile concrete, de
exemplu, 500400 pixeli;
hWindParent descriptorul ferestrei printe. Dac fereastra printe nu este, se folosete
valoarea NULL;
hMenu descriptorul meniului, adic dac aplicaia are un meniu, poate fi indicat
descriptorul acestui meniu i meniul va fi conectat la fereastra aplicaiei. dac meniul
lipsete, atunci valoarea parametrului se pune pe NULL;
hInstance exemplarul aplicaiei. Folosete valoarea hinstance pasat funciei
WinMain();
lpParam pointerul la datele ferestrei, de obicei are valoarea NULL.
Acum toate valorile ale parametrilor funciei sunt cunoscute. Pentru a crea fereastra, declarm
descriptorul ferestrei i apelm funcia CreateWindowEx():
HWND hwnd; // descriptorul ferestrei
if(!(hwnd=CreateWindowEx(
NULL, // stilul ferestrei
_T("WINDOWSCLASS"), // numele clasei
_T("Fereastr de baz pentru DirectX"), // antetul ferestrei
13
//
//
WS_OVERLAPPEDWINDOW|WS_VISIBLE, //
0, 0, // colul stnga sus
CW_USEDEFAULT, 0, // colul stnga sus
500, 400, // limea i nlimea ferestrei
CW_USEDEFAULT, 0, // limea i nlimea ferestrei
NULL, // descriptoruil ferestrei printe
NULL, // descriptorul meniului
hinstance, // descriptorul aplicaiei
NULL))) // pointerul la datele ferestrei
return 0;
WM_DESTROY mesajul acesta se trimite de ctre SO Windows atunci cnd fereastra trebuie
s fie nchis. Mesajul acesta comunic c trebuie de eliberat toate resursele ocupate de ctre
aplicaia;
WM_QUIT dup eliberarea resurselor se genereaz mesajul acesta care va aduce la
nchiderea aplicaiei.
Ca rezultat obinem funcia MainWinProc():
LRESULT CALLBACK MainWinProc(HWND hwnd, // descriptorul ferestrei
UINT msg, // identificat. evenimentului
WPARAM wparam, // informaii suplimentare
LPARAM lparam) // informaii suplimentare
{
switch(msg)
{
//
case WM_PAINT:
ValidateRect(hwnd, NULL);
break;
//
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
UINT wMsgFiltrenMax)
17