Lekcija 1: Kreiranje Direct3D prozora

 

Kao i svaka druga Win aplikacija, i DirectX aplikacija počinje sa WinMain funkcijom. Nikada se nisam igrao sa WinAPI-em, no neke stvari se jednostavno moraju znati. Dakle svaki prozor koji se želi otvoriti, mra se prvo registrirati njegovu klasa, te zatim kreirati njegova instanca. Klasa prozora se registrira pomoću iduće dvije funkcije:

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,           

                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,      

                      "D3D Aplikacija", NULL };                           

       RegisterClassEx(&wc);                                                     

 

Način na koji ove funkcije rade, te koji su parametri, možete vidjeti u MSDN knjižnici, ili ako imate MSVC.NET izravno u indexu help-a, no to nije toliko bitno za ovaj program, i neću opisivati svaki parametar. Najbitnija stvar je treći parametar koji navodi proceduru koja će se koristiti za obradu windows poruka, kroz tutoriale ovaj dio se neće previše mijenjati, i mislim da ćete moći pratiti kod. Cijeli prvi tutorial je uglavnom copy-paste dio koda, i u rijetkim slučajevima se treba mijenjati.

Nakon registracije klase, koja se u ovom slučaju zove wc, potrebno je stvoriti instancu prozora gore navedene klase. Ovaj dio izvodi se pomoću iduće API naredbe:

 

    HWND hWnd = CreateWindow( "D3D Aplikacija", "Prva D3D aplikacija",           

                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,           

                              GetDesktopWindow(), NULL, wc.hInstance, NULL );    

 

Ova naredba stvara prozor koji se zove "D3D Aplikacija" i opis joj je "Prva D3D aplikacija". Veličina prozora biti će 300x300. Pokazivač (handle) na taj prozor spremiti ćemo u varijablu hWnd i ona će nam trebati kasnije, kod inicijalizacije 3D grafike.

 

Idući korak u stvaranju aplikacije je kreiranje objekata i inicijalizacija grafike, tj. sve one akcije koje se dešavaju samo na početku programa, i nikada više. U prvoj aplikaciji kreirat ćemo Scene objekt koji predstavlja klasu funkcionalnosti Direct3D-a u ovom programu. Scene je klase CScene, i sadrži metode za inicijalizaciju 3D grafike i renderiranje 3D objekata. Kreiranje Scene objekta i njegova inicijalizacija, te inicijalizacija 3D grafike unutar njega, iz glavnog programa izvodi se sa iduće dvije naredbe:

 

//kreiraj glavni objekt                                                   

       Scene= new CScene();           

                                                                                                                                                                                                                                                 

//Inicijaliziraj scenu                                                    

       Scene->Inicijaliziraj(hWnd);                                              

 

Samo druga naredba vrši inicijalizaciju objekata i 3D grafike, prva samo kreira instancu klase CScene. Kako radi metoda Inicijaliziraj objasniti ću malo kasnije.

Treći korak je prikazivanje samog prozora, te ulazak u glavnu petlju koja će se vrtjeti kroz cijelo trajanje programa. Main.cpp također sadrži CleanUp(); metodu koja nakon završetka aplikacije čisti objekte i sučelja. Ovo se obavlja pomoću dva makroa koji su definirani u helper.h datoteci. Kada sam već kod toga, da pokušam objasniti princip na kojem rade interface-i(sučelja). Interface je sučelje prema objektu, obično dijelu COM-a, odnosno  Component Object Menager-a, kojem aplikacija nema izravan pristup, već ima samo pristup nekim njegovim metodama. Ovo onemogućava klasično kreiranje i manipulaciju takvim objektima, te se oni moraju kreirati i odpuštati posebnim metodama. COM objekti se kreiraju uglavnom pomoću Create funkcija, tipa Direct3DCreate, te CreateDevice, dok se obični objekti kreiraju new operatorom. U sceni, objekti proizvoljnih klasa uvjek su definirani kao pointeri što omogućava korištenje new i delete operatora, i to je najbolji način. Kreiranje direktne instance je gotovo nezamislivo, i ja ne preporučam takav način pisanja, osim ako se ne radi o čistim strukturama, pa čak ni onda.

 

Da krenemo na Inicijaliziraj metodu, koja je dio CScene klase. Inicijaliziraj za sada poziva samo metodu InicijalizirajD3D. U ovoj metodi inicijalizira se D3D objekt i uređaj. D3D objekt odnosno njegov interface IDirect3D9 (pointer tipa LPDIRECT3D9) koristi se za kreiranje D3D uređaja i za ispitivanje mogučnosti računala koje vrti aplikaciju.

 

if( NULL == (D3DObject = Direct3DCreate9( D3D_SDK_VERSION ) ) )       

return E_FAIL;                                                           

 

 

Nakon toga podešavaju se parametri za kreiranje D3D objekta i prema njima se on kreira.

Interface prema D3D uređaju je IDirect3DDevice9, a pointer na njega je tipa LPDIRECT3DDEVICE9. Dakle ako kretiramo varijablu tipa LPDIRECT3DDEVICE9, ona predstavlja pointer na IDirect3DDevice9 sučelje.

 

    D3DPRESENT_PARAMETERS d3dpp;                                                 

    ZeroMemory( &d3dpp, sizeof(d3dpp) );                                  

    d3dpp.Windowed = TRUE;

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

 

if( FAILED( D3DObject->CreateDevice( D3DADAPTER_DEFAULT,                                                      

                                      D3DDEVTYPE_HAL,hWnd,                    

                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,

                                      &d3dpp, &D3DDevice ) ) )                   

 

Dalje u dubinu nećemo ići u ovoj lekciji. Uglavnom kreirali smo D3D objekt i D3D uređaj, i to moramo napraviti kada god želimo prikazati neke objekte na monitoru, ova dva objekta su osnova D3D programiranja.

 

Kao što piše u kodu, nakon inicijalizacije glavni program pokreće glavnu petlju pozivom metode Petlja, koja je također dio CScene objekta. U ovoj petlji obavljat će se renderiranje te procesiranje windows poruka, pri svakom prolazu kroz nju. Ovu petlju zaustavlja jedino korisnik pritiskom na tipku ESC, što odgovara obradi poruke u WinProc proceduri. Render funkcija za sada samo čisti monitor, i sastoji se od 4 metode.

 

D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 150), 1.0f, 0);   

//Čisti površinu na koju crtamo                                                  

D3DDevice->BeginScene();//započinje scenu

//ovdje će se nalaziti Render metode objekata                                    

D3DDevice->EndScene();//završava scenu

 

D3DDevice->Present(NULL, NULL, NULL, NULL);                                      

//prikazuje površinu na koju smo renderirali                                     

 

Potrudio sam se da komentiram svaku liniju koda u programima, tako da bude lako razumljiv, pa i za  one koji prvo vole pročitati kod, čitanje dokumantacije neće biti ni potrebno.

 

Ako imate MSCV.NET, quick info će vam pokazati i kratki opis funkcije pri njenom pozivu. Ovo se dobiva tako da se nakon deklaracije člana ili metode klase iza nje u jednolinijskom komentaru napiše njen opis koji će MSVC interpretirati kod pisanja koda.

 

 

 

Izgled prve aplikacije:

 

Skini source kod

 

 

Made By: Mll.


Prev Next