Benvenuto! Per postare e godere delle funzionalità del forum registrati, occorrono pochi secondi ed è gratis!

[Guida] D3D - diamogli un occhio
(Questo messaggio è stato modificato l'ultima volta il: 06/08/2011, 20:57 da Admin.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
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 Smile

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 Smile

[Immagine: 01804-3e40889c-7fe3-4057-a215-1072a1617851.png]

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"

[Immagine: 01804-6ee47ad5-1a87-430a-ad9a-cdc425ebfa60.png]

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

[Immagine: 01804-f2fc70c9-bfb9-4e47-9799-8f5170c19ba9.png]

6. premiamo OK, quindi Next e siamo qui:

[Immagine: 01804-d13a0acb-a232-44af-9899-b83f44ecff0b.png]

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:

[Immagine: 01804-c89bc700-5a28-4bb2-a07d-d6b6489bac31.png]

10. nella finestra che compare selezioniamo "C++ File (.cpp)"
11. sotto inseriamo un nome per questo file sorgente, ovvero "main.cpp" , cosi:

[Immagine: 01804-ad56f34a-af66-4fcb-9a04-37f3fd770973.png]

Ora l'aspetto del solution explorer sarà cosi, con il main.cpp aggiunto:

[Immagine: 01804-8be7b434-b7f9-4a5e-adc1-930827509453.png]

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
  1. #include <d3d9.h>
  2.  
  3. LPDIRECT3D9 g_pD3D = NULL; // usato pre creare il D3DDevice
  4. LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // il rendering device
  5.  
  6.  
  7. //-----------------------------------------------------------------------------
  8. // Name: InitD3D()
  9. // Desc: Inizializza il Direct3D
  10. //-----------------------------------------------------------------------------
  11. HRESULT InitD3D( HWND hWnd )
  12. {
  13. if(NULL==(g_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))return E_FAIL;
  14.  
  15. D3DPRESENT_PARAMETERS d3dpp;
  16. ZeroMemory( &d3dpp, sizeof(d3dpp) );
  17. d3dpp.Windowed = TRUE;
  18. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  19. d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
  20.  
  21. if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
  22. D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  23. &d3dpp, &g_pd3dDevice ) ) )
  24. {
  25. return E_FAIL;
  26. }
  27.  
  28. return S_OK;
  29. }
  30.  
  31.  
  32. //-----------------------------------------------------------------------------
  33. // Name: Cleanup()
  34. // Desc: rilasciamo tutti gli oggetti inizializzati in precedenza
  35. //-----------------------------------------------------------------------------
  36. VOID Cleanup()
  37. {
  38. if( g_pd3dDevice != NULL)
  39. g_pd3dDevice->Release();
  40.  
  41. if( g_pD3D != NULL)
  42. g_pD3D->Release();
  43. }
  44.  
  45.  
  46.  
  47.  
  48. //-----------------------------------------------------------------------------
  49. // Name: Render()
  50. // Desc: Disegna la scena
  51. //-----------------------------------------------------------------------------
  52. VOID Render()
  53. {
  54. if( NULL == g_pd3dDevice )
  55. return;
  56.  
  57. // Clear the backbuffer to a blue color
  58. g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
  59.  
  60. // Iniziamo la scena
  61. if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
  62. {
  63. // qui dovremmo mettere il rendering dei vari oggetti in scena
  64.  
  65. // finiamo la scena
  66. g_pd3dDevice->EndScene();
  67. }
  68.  
  69. // Present_iamo il backbuffer a video, lo visualizziamo
  70. g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
  71. }
  72.  
  73.  
  74.  
  75.  
  76. //-----------------------------------------------------------------------------
  77. // Name: MsgProc()
  78. // Desc: qui vengono gestiti i messaggi della finestra (window's message handler)
  79. //-----------------------------------------------------------------------------
  80. LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
  81. {
  82. switch( msg )
  83. {
  84. case WM_DESTROY:
  85. Cleanup();
  86. PostQuitMessage( 0 );
  87. return 0;
  88.  
  89. case WM_PAINT:
  90. Render();
  91. ValidateRect( hWnd, NULL );
  92. return 0;
  93. }
  94.  
  95. return DefWindowProc( hWnd, msg, wParam, lParam );
  96. }
  97.  
  98.  
  99. //-----------------------------------------------------------------------------
  100. // Name: WinMain()
  101. // Desc: L'entry point dell'applicazione, l'esecuzione parte da qui
  102. //-----------------------------------------------------------------------------
  103. INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
  104. {
  105. // registriamo la window class
  106. WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
  107. GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
  108. "D3D Tutorial", NULL };
  109. RegisterClassEx( &wc );
  110.  
  111. // Creiamo la finestra dell'applicazione
  112. HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice",
  113. WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
  114. GetDesktopWindow(), NULL, wc.hInstance, NULL );
  115.  
  116. // Inizializziamo il D3D
  117. if( SUCCEEDED( InitD3D( hWnd ) ) )
  118. {
  119. // Visualizziamo la finestra
  120. ShowWindow( hWnd, SW_SHOWDEFAULT );
  121. UpdateWindow( hWnd );
  122.  
  123. // il "message loop"
  124. MSG msg;
  125. while( GetMessage( &msg, NULL, 0, 0 ) )
  126. {
  127. TranslateMessage( &msg );
  128. DispatchMessage( &msg );
  129. }
  130. }
  131.  
  132. UnregisterClass( "D3D Tutorial", wc.hInstance );
  133. return 0;
  134. }




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

[Immagine: 01804-c806e520-ef17-4f99-b762-f711a154b7e1.png]

Questo è il risultato:

[Immagine: 01804-8d88b59f-1f45-4b88-9da7-7a6ae606d219.png]

Oops, qualcosa è andato storto... cosa è successo?
Rispondiamo "NO" che non vogliamo proseguire.
Vediamo sotto nell'area messaggi gli errori per capire cosa è successo...

[Immagine: 01804-3f32dc72-edd3-41ab-b912-052fefe41980.png]

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"

[Immagine: 01804-1c22f027-3961-4571-918a-a56eb555d1e3.png]

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"

[Immagine: 01804-3d51d81c-a829-4d84-99b5-c3e61ece48ed.png]

17. bene confermiamo e riproviamo a runnare con F5...

Oops di nuovo errore! ma non se ne può piu! Happywide
Cosa c'è stavolta?
Rivediamo la finestra degli errori:

[Immagine: 01804-5e8f719f-945d-487f-b5f7-6257dbfb8af0.png]

allora, una notizia buona e una cattiva, quale volte prima?...

Ok prima la buona, gli errori di prima sono spariti! Smile
Cattiva... ce n'è uno nuovo Sad
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"
[Immagine: 01804-f30a5098-7fa1-427d-8308-13b0aa77b973.png]

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:
[Immagine: 01804-6e8a740e-709d-4b6c-8fd4-c7f2ceb9deb1.png]

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" :

[Immagine: 01804-aadcc02e-b4b6-49de-aadd-a7ce3f3892d5.png]

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:

[Immagine: 01804-9940fe24-ee74-4122-bba2-b8215f6bc3b7.png]

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









digger
04/08/2011, 21:10
#1
Cerca

Iscritto
Messaggi: 891
Discussioni: 58
Registrato: 03-2011
Mix: 0
(04/08/2011, 21:10)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

in futuro basterà aggiungere poche (poche?) righe di codice qua e la per ottenere i primi veri interessanti risultati in campo Direct3D...

POCHE!?

(04/08/2011, 21:10)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Oops di nuovo errore! ma non se ne può piu! Happywide

Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd Asd

Bravo!!


04/08/2011, 21:35
#2
Cerca
(Questo messaggio è stato modificato l'ultima volta il: 06/08/2011, 10:35 da digger.)

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
poche? perchè in realtà uno si aspetta e spera che basta una linea di codice per fare una cosa tutto sommato semplice e invece vedi che devi scriverne magari 5, 6 , 10 e magari anche abbastanza difficili da capire in un primo momento... e anche in un secondo Tounge

per dare un'idea... un esempio che fa vedere come visualizzare a video una bitmap "recita" cosi:

    C++ Programming
  1. // Set the vertex stream, shader, and texture
  2. g_pD3DDevice->SetStreamSource(0, g_pVB, sizeof(sVertex));
  3. g_pD3DDevice->SetVertexShader(VERTEXFVF);
  4. g_pD3DDevice->SetTexture(0, g_pTexture);
  5.  
  6. // Draw the vertex buffer
  7. g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
  8.  
  9. // Release texture
  10. g_pD3DDevice->SetTexture(0, NULL);



quando magari uno sperava in una cosa tipo

DrawPicture(pic,x,y,width,height);

Happywide



digger
04/08/2011, 21:39
#3
Cerca

Amministratore
Messaggi: 2,338
Discussioni: 233
Registrato: 03-2011
Mix: 2,578.4
Ottima guida Happywide


[Per vedere i link devi REGISTRARTI.]

Prima di aprire ogni contenuto scaricato su siti esterni ad HackMix, scansionatelo su VirusTotal.
06/08/2011, 20:57
#4
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
Io lo adoro per 2 motivi:
1) Fa morire dalle risate in ogni suo post, perchè non spiega un argomento, ma gli crea su una storiella tipo quelle per far mangiare i bambini piccoli Asd
2) Non so dove trova la voglia, l'energia e la quiete psico-emo-nervosa per fare tutti quegli screen Asd Asd

10/08/2011, 14:25
#5
Cerca

Il criceto mannaro
Messaggi: 3,536
Discussioni: 201
Registrato: 03-2011
Mix: 3,737
(10/08/2011, 14:25)Skyline@69 Ha scritto:

[Per vedere i link devi REGISTRARTI.]

Io lo adoro per 2 motivi:
1) Fa morire dalle risate in ogni suo post, perchè non spiega un argomento, ma gli crea su una storiella tipo quelle per far mangiare i bambini piccoli Asd
2) Non so dove trova la voglia, l'energia e la quiete psico-emo-nervosa per fare tutti quegli screen Asd Asd

ahah stavolta mi hai fatto ridere tu Happywide
vedo che sai cosa vuol dire fare screen a gogo... hai ragione non so nemmeno io dove trovo tutto quello che dici... infatti tante volte le guide non le faccio proprio perchè non ho voglia di passare da quella rottura... ma io niente screen niente guida Smile






digger
10/08/2011, 23:27
#6
Cerca

WarRock Hacks Coder
Messaggi: 940
Discussioni: 47
Registrato: 03-2011
Mix: 0
(10/08/2011, 23:27)digger Ha scritto:

[Per vedere i link devi REGISTRARTI.]

ahah stavolta mi hai fatto ridere tu Happywide
vedo che sai cosa vuol dire fare screen a gogo... hai ragione non so nemmeno io dove trovo tutto quello che dici... infatti tante volte le guide non le faccio proprio perchè non ho voglia di passare da quella rottura... ma io niente screen niente guida Smile

We :heart: U Happywide

13/08/2011, 19:12
#7
Cerca




Utenti che stanno guardando questa discussione: 1 Ospite(i)