Ciao a tutti,
mi sono accorto che pochi o nessuno postano qualcosa per quel che riguarda le DirectX (sentito parlare di D3D ? Direct3D ?)
Cosi ho deciso di postare qualcosa io.
Non sono per niente un esperto dell'argomento, ma visto che pensavo di approfondire le mie conoscenze, già che ci sono man mano che me lo (ri-)guardo, posto anche qualcosa cosi mi aiuto a memorizzare un po' di concetti e intanto magari solletico l'appetito di qualcuno interessato.
Questo primo post arriva dritto dritto dagli esempi presenti del DirectX SDK 9, ho giusto tradotto qualcosina dall'inglese per i pigri
Cominciamo...
Il primo programmmino non è niente di che, ma serve per cominciare a prendere confidenza con il tipico "scheletro" di un'applicativo Direct3D.
Se avete già visto come si scrive un programma in C++ per console noterete che è un bel po' diverso.
Questo non è dovuto al fatto che stiamo scrivendo un prog usando le DirectX ma è dovuto al fatto che si tratta di un programma Windows e NON un programma console.
I programmi per windows richiedono alcune cose che devono sempre esserci, come la window's procedure, l'inizializzazione della finestra, la registrazione della window class etc.
Comunque non ha molta importanza sinceramente perdersi in queste cose in quanto alla fine quello che conta una volta capito di cosa si parla è fare copia incolla della struttura base presente in questo esempio e "arricchirla" con quello che ci serve poi per "disegnare" a video quello che ci serve.
Questo primo esempio una volta compilato ci presenterà questa finestra, di fatto un vero e proprio programma D3D, tranne che non fa niente
Ripeto, non fa niente ma è importante notare che contiene la BASE che ci serve per i futuri test del D3D quindi vale la pena soffermarsi a testarla e giocarci un po'.
PREMESSA!
vi servono alcune cose per procedere:
1. un Visual C++ qualsiasi versione (2005, 2008, 2010, express, professional, etc)
2. il directx SDK, scaricabile da MicroZozz, io sto usando "Microsoft DirectX 9.0 SDK Update (Summer 2004)"
Se siamo a posto con Visual C++ e con l'SDK installato sul computer allora possiamo proseguire.
1. apriamo (ad esempio) Visual C++ 2010 express
2. "New Project"
3. Selezioniamo come tipologia "Win32" e quindi a destra "Win32 Project"
4. sotto ci inventiamo un nome per il progetto, ad es. "01CreateDevice"
5. sotto ancora gli diamo un percorso sul disco per il progetto
6. premiamo OK, quindi Next e siamo qui:
7. settate tutto come da screenshot quindi Windows application e Empty project e premete Finish
8. ok siamo "dentro", ora dobbiamo aggiungere il file sorgente che conterrà il codice, quindi...
9. Nel "SolutionExplorer" andiamo sulla cartella Source, tasto destro, Add new Item, cosi:
10. nella finestra che compare selezioniamo "C++ File (.cpp)"
11. sotto inseriamo un nome per questo file sorgente, ovvero "main.cpp" , cosi:
Ora l'aspetto del solution explorer sarà cosi, con il main.cpp aggiunto:
e nell'area centrare vedremo l'editor del codice che aspetta che scriviamo qualcosa.
Noi invece faremo Copia Incolla del codice che riporto qui di seguito:
C++ Programming
#include <d3d9.h>
LPDIRECT3D9 g_pD3D = NULL; // usato pre creare il D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // il rendering device
//-----------------------------------------------------------------------------
// Name: InitD3D()
// Desc: Inizializza il Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
//-----------------------------------------------------------------------------
// Name: Cleanup()
// Desc: rilasciamo tutti gli oggetti inizializzati in precedenza
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
}
//-----------------------------------------------------------------------------
// Name: Render()
// Desc: Disegna la scena
//-----------------------------------------------------------------------------
VOID Render()
{
if( NULL == g_pd3dDevice )
return;
// Clear the backbuffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Iniziamo la scena
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// qui dovremmo mettere il rendering dei vari oggetti in scena
// finiamo la scena
g_pd3dDevice->EndScene();
}
// Present_iamo il backbuffer a video, lo visualizziamo
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: qui vengono gestiti i messaggi della finestra (window's message handler)
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: L'entry point dell'applicazione, l'esecuzione parte da qui
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// registriamo la window class
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"D3D Tutorial", NULL };
RegisterClassEx( &wc );
// Creiamo la finestra dell'applicazione
HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
// Inizializziamo il D3D
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
// Visualizziamo la finestra
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
// il "message loop"
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
UnregisterClass( "D3D Tutorial", wc.hInstance );
return 0;
}
12. Una volta incollato proviamo a runnarlo cliccando su "run" oppure premendo F5.
13. ci esce questa finestra, dove ovviamente risponderemo "yes" che vogliamo buildare e runnare
Questo è il risultato:
Oops, qualcosa è andato storto... cosa è successo?
Rispondiamo "NO" che non vogliamo proseguire.
Vediamo sotto nell'area messaggi gli errori per capire cosa è successo...
Questo tipo di errore è abbastanza comune e se codderete in futuro vi capiterà spesso di vederlo, la soluzione piu veloce è abbastanza facile da implementare.
Dobbiamo andare nei settaggi del progetto e cambiare il "character set" che di default è "UNICODE" mentre dobbiamo impostarlo come "Multibyte character set".
Quindi vediamolo in dettaglio:
14. in solution explorer facciamo tasto destro sul nome del progetto e quindi "properties"
15. nella finestra che esce vediamo subito sulla destra la malefica impostazione "Use unicode Character set"
16. scorriamo nelle scelte e selezioniamo "Use multi-byte character set"
17. bene confermiamo e riproviamo a runnare con F5...
Oops di nuovo errore! ma non se ne può piu!
Cosa c'è stavolta?
Rivediamo la finestra degli errori:
allora, una notizia buona e una cattiva, quale volte prima?...
Ok prima la buona, gli errori di prima sono spariti!
Cattiva... ce n'è uno nuovo
Dice che non trova Direct3DCreate... mmm molto male non trova un pezzo del directx...
come mai non lo trova?
questo dovrebbe farci venire in mente che se non lo trova è perchè lo cerca nel posto sbagliato.
E il posto dove deve cercare glielo dobbiamo dire noi e siccome ancora non glielo abbiamo detto ecco il perchè!
Quindi procediamo con l'andare a dire a Visual C++ dove stanno tutti i files del DirectX SDK che gli servono:
18. in solution explorer come prima tasto destro sul nome del progetto e poi "properties"
19. questa volta ci spostiamo su "VC++ Directories"
20. a destra selezioniamo "Include Directories"
21. dal menu a discesa selezioniamo <Edit...>
Ci compare questa finestra:
dove dobbiamo:
22. cliccare sulla prima icona per creare una entry
23. poi sul pulsante con i ... per editarla, ci esce un dialog di ricerca cartella
24. in quello andiamo a cercare la cartella "Include" che si trova sotto quella dove avete installato il DirectX SDK , nel mio caso si trova in c:\programmi\Microsoft Directx 9.0 SDK (Summer 2009)
35. una volta selezionato "Include" possiamo dare OK e poi ancora OK
36. facciamo lo stesso ma invece che per include, lo facciamo per "Library" (poco sotto), e selezioniamo la cartella dell'SDK che si chiama "LIB" :
A questo punto il nostro Visual C++ sa dove andare a cercare i files di DirectX necessari,
ma pensate sia finita?
nono
rimane un ultimo passaggio, gli abbiamo detto in quale cartelle andare a cercare, ma se per gli include i file da cercare glieli diciamo nel codice con #include <d3d9.h> ad esempio, non gli abbiamo ancora detto QUALE libreria andare a prendere...
Bene, per questo programma semplice l'unica che ci serve è la d3d9.lib quindi la andiamo ad aggiungere qui:
Ormai dovreste sapere come arrivarci, solution explorer, tasto destro sul nome del progetto, poi "linker" poi "input" e a destra in "additional dependencies" scrivete come prima voce d3d9.lib;
attenzione al ; che serve a separare i nomi delle libs
Date ok a tutto e quindi di nuovo F5 per runnare.
BINGO!
si è compilato, eseguito, ed è comparsa a video la finestra!
ok lo so che non è un gran che come d3d ma dovete pensare che ora avete lo "scheletro", in futuro basterà aggiungere poche (poche?) righe di codice qua e la per ottenere i primi veri interessanti risultati in campo Direct3D...
per oggi è tutto
la prox volta spiegherò meglio cosa fanno le righe di codice che avete incollato sopra.
ciao
Digger