| Ad_Infinitum |
| Administrator |

 |
 |
| Data inscrierii: 23/Iun/2007 |
| Mesaje: 212 |
|
|
|
 |
 |
 |
|
Tutorial 1
- Initializarea unei ferestre D3D -
Bine ati venit in lumea DirectX-ului. DirectX este o colectie de librarii utilare,
cu susținerea carora se pot crea jocuri. DirectX este alcatuit, din sub-grupe,
care servesc o varietate de necesasitati in crearea unui joc.
DirectX este alcatuit din: DirectGraphics, DirectInput, DirectSound, DirectMusic, DirectPlay.
Sa vedem in detaliu librariile DirectGraphics. DirectGraphics este a combinatie,
intre librariile 2D si 3D, numite DirectDraw respectiv Direct3D. DirectDraw,
sunt librarii demodate, care nu prea se mai folosesc, si erau incluse pina la versiunea dx7.
De la dx8 directdraw apare doar ca "backward compatibility", pentru că mulțimea se mutase pe 3D.
Au aparut tone de acceleratoare si nu mai era necesitate de DirectDraw, fiindca se putea simula 2D,
print 3D cu o camera fixata. In plus se puteau adauga o multitudine de efecte suportate de placa grafica,
care era optimizata pentru 3D, iar DirectDraw fiind mai mult software oriented, a iesit din joc.
In acest tutorial vom crea o fereastra pentru care vom initializa D3D.
E un lucru nespus de simplu,
si parcurg acest pas doar ca sa va fammiliarizati cu bazele Dx8. Limbaj de programare este Visual Basic, dar e usor sa transporti sursa pentru C++.
Motivul pentru care e bine sa incepeti DirectX sub visual basic, e faptul ca VB6 IDE va arata toate functiile si constantele continute intr-o librarie. (ex. daca introduci "D3DX." va aparea a lista cu toate functiile grupate in libraria D3DX)
In inițialul si in debutantul rand, incepeti cu un proiect nou in VB, salvati formul si proiectul intr-un director nou, si dati click pe Project > Refrences. Cautati prin lista "DirectX 8 for Visual Basic Type Library". Astfel VB va importa obiectele DirectX pentru VB.
Renumiti formul Form1 in "frmMain" (sau absolut orice altceva, dar nu uitati de numele ferestrei )
De obicei eu mai adaug un modul numit Direct3D unde voi tine toate functiile legate de D3D.
Acest lucru e optional, dar codul va fi mult mai curat asa.
In frmMain, creati o variabila de tip boolean "bRunning", care va fi utilizat la loop-ul principal.
La proprietatea "Form_Load" vom adauga de fapt toate instructiunile de pornire, randarizare si terminare.
Aici vom initializa fereastra, si pana cand vom iesi din program loop-ul principal
va chema in continui functia "Render" si "DoEvents".
Render va desena scena, iar DoEvents este functia care va lasa windowsul,
sa efectueze tot ceea ce se afla in background. (de exemplu winampul, care canta manele :P,
dar in aparte sa aiba timp sa redeseneze formul, sa se uite la mouse, si altele)
Sa vedem cum arata un cod frmMain.
Cod:
Dim bRunning As Boolean 'is used to know if the program is running
'to quit the program simply change bRunning to false
'this will stop the main loop and start the unload functions
Private Sub Form_Load()
Me.Show
bRunning = Direct3D.InitD3D(False)
Do While bRunning
Direct3D.Render
DoEvents
Loop
Direct3D.TerminateDirect3D 'Clean up device and DirectX objects
End
End Sub
Private Sub Form_Unload(Cancel As Integer)
bRunning = False 'Quit program if you manually closed window (Alt+F4 or Close button)
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyEscape Then bRunning = False 'if Escape key is pressed Quit program
End Sub
Simplu nu? Uitati-va peste cod in detaliu, si veti vedea de ce e bine asa.
Pentru a incheia rularea programului, se va folosi oricand comanda "bRunning = false".
Programul va iesi din loop-ul principal, si va executa "TerminateDirect3D".
Pana acum a fost partea usoara. Sa vedem acum partea aproape la fel de usoara
Variabile si obiecte necesare pentru initializare.
Cod:
Public DX As New DirectX8 'Our main DirectX object
Public D3DX As New D3DX8 'D3DX is a helper library
Public D3D As Direct3D8 'The main Direct3D object
Public D3DDevice As Direct3DDevice8 'Our Direct3D compilant device object
Nu e greu iar la inceput e destul sa stii ca ai trebuință de aceste obiecte.
DX - e obiectul DirectX principal.
D3DX - contine functii utilare, cum ar fi de exemplu incarcarea texturilor de anumite formate (jpg, bmp, etc.)
De întocmai te mai ajuta la formatele .X si mai contine multe alte functii utile.
D3D - este obiectul Direct3D principal, care contine functiile de initializare.
D3DDevice - va fi obiectul care va face legatura dintre noi si Direct3D.
Cod:
Dim Dispmode As D3DDISPLAYMODE 'Stores the DisplayResolution, and other information
Dim D3DWindow As D3DPRESENT_PARAMETERS 'Our Direct3D window
Dim DevCaps As D3DCAPS8 'Our Graphics Hardware capabilities
Displaymode va contine informatii despre formatul si rezolutia ferestrei, DevCaps informatii despre placa grafica,
iar D3DWindow va contine toti parametrii ferestrei noastre.
De fapt initializarea inseamna creerea obiectului "D3DDevice" conform parametrilor din D3DWindow.
Sa vedem cum va arata functia InitD3D:
Cod:
Public Function InitD3D(FullSCR As Boolean) As Boolean
'--------------------------------------------------------------'
'Checks device caps. If available, then initializes them. '
'If every initialization was succesfull, true is being returned'
'--------------------------------------------------------------'
On Error GoTo BailOutInit
'On Error Resume Next ' Use this if you want to force the program to start
Set DX = New DirectX8
Set D3D = DX.Direct3DCreate()
Set D3DX = New D3DX8
D3D.GetDeviceCaps D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DevCaps
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Dispmode
'> Presentation Parameters
If FullSCR Then
D3DWindow.Windowed = 0
D3DWindow.BackBufferFormat = Dispmode.Format
D3DWindow.BackBufferCount = 1
D3DWindow.BackBufferWidth = Dispmode.Width
D3DWindow.BackBufferHeight = Dispmode.Height
Else
D3DWindow.Windowed = 1
D3DWindow.BackBufferFormat = Dispmode.Format
End If
D3DWindow.hDeviceWindow = frmMain.hWnd
D3DWindow.SwapEffect = D3DSWAPEFFECT_COPY ' D3DSWAPEFFECT_COPY
'> Stencil depth
If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Dispmode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
D3DWindow.AutoDepthStencilFormat = D3DFMT_D16
D3DWindow.EnableAutoDepthStencil = 1
Else
D3DWindow.EnableAutoDepthStencil = 0
End If
'> Hardware/Software VP & initialization
Set D3DDevice = D3D.CreateDevice(0, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DWindow)
If D3DDevice Is Nothing Then Set D3DDevice = D3D.CreateDevice(0, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)
InitD3D = True
Exit Function
BailOutInit:
InitD3D = False
MsgBox "There was an error initializing the graphics engine!", vbInformation
End Function
Foarte simplu, dar cam lung. Sa vedem pas cu pas ce inseamna.
Cod:
Set DX = New DirectX8
Set D3D = DX.Direct3DCreate()
Set D3DX = New D3DX8
D3D.GetDeviceCaps D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DevCaps
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Dispmode
Se creaza obiectele pentru DirectX, Direct3D si D3Dx, se detecteaza capabilitatile placii, si rezolutia curenta. (inclusiv formatul imaginii, mai simplu spus ~"Color Deph" la windows)
Cod:
If FullSCR Then
D3DWindow.Windowed = 0
D3DWindow.BackBufferFormat = Dispmode.Format
D3DWindow.BackBufferCount = 1
D3DWindow.BackBufferWidth = Dispmode.Width
D3DWindow.BackBufferHeight = Dispmode.Height
Else
D3DWindow.Windowed = 1
D3DWindow.BackBufferFormat = Dispmode.Format
End If
Cel mai necomplicat e folosirea Direct3D in mod fereasra(windowed). Pentru a folosi fullscreen va trebui specificat si un BackBuffer.
Iar formatul lui va fi identic ca formatul curent. (ca la windows) Asta inseamna DispMode,
daca va amintiti mai devreme, Dispmode contine informatii despre dispoziția de rezolutie a calculatorului.
Cod:
D3DWindow.hDeviceWindow = frmMain.hWnd
Codul de mai sus specifica pentru direct3d care fereastra e cea activa. (unde vrem sa fie "pusa" randarizarea)
(hWnd -> handle of Window)
Partea cu stencil depth e mai complicat, dar momentan e deajuns sa stim ca e nevoie si de ea.
Mai incolo va voi povesti despre asta.
In sfirsit am ajuns la initializarea propriuzisa:
Cod:
Set D3DDevice = D3D.CreateDevice(0, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, D3DWindow)
Sa vedem in detaliu:
CreateDevice(Adapter, DeviceType, FocusWindow, Behaviour, Presentation)
Adapter - Indexul adapterului de obicei 0
DeviceType - D3DDEVTYPE_HAL sau D3DDEVTYPE_REF sau D3DDEVTYPE_SW.
Simplu: HAL - Hardware Accalareted
REF - Reference Device (e un fel de HAL emulat cu TOATE capabilitatile HW necesare, e deosebit de lent, totul e facut de catre CPU)
SW - Software rendered (nu se foloseste, mai de mult era la moda, este un render simplificat, de proasta calitate, nu necesita accelerator grafic)
FocusWIndow - din nou se precizeaza frmMain.hwnd
Behaviour - D3DCREATE_HARDWARE_VERTEXPROCESSING sau D3DCREATE_SOFTWARE_VERTEXPROCESSING (daca placa suporta HW T&L sau nu, hardware e mult mai rapid, in detaliu mai tarziu)
Presentation - Aici se introduce Variabila D3DWIndow, pentru a descrie formatul imaginii, rezolutia, etc.
Pana aici a fost bucată grea, de acum e doar un joc.
Terminarea obiectelor se face astfel:
Cod:
Public Sub TerminateDirect3D()
'-----------------'
'Unloading objects'
'-----------------'
Set D3DX = Nothing
Set D3DDevice = Nothing
Set D3D = Nothing
Set DX = Nothing
End Sub
Nu uitati nici odata sa distrugeti obiectele voastre, ca altfel raman in memorie,
si in special directX va crapa daca uiti sa eliberezi obiectele lui.
2-3 porninri de directX fara sa inchizi obiectele te vor forta la un restart.
In sfirsit sa vedem functia render, care este cea mai importanta pentru en engine D3D bun ;)
Cod:
Public Sub Render()
'------------------------------------------------------------'
'The entire rendering of objects, and presentation on screen '
'------------------------------------------------------------'
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF00FF, 1#, 0
D3DDevice.BeginScene
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub
Simplu nu ?
Tot ceea ce este de desenat va intra intre BeginScene si Endscene. In urmatorul tutorial vom vedea cum se poate desena ceva.
In tutorialul curent vom vedea doar un background colorat.
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, &HFF00FF, 1#, 0
Clear este procedura care sterge cadrul vechi, pregatind scena pentru urmatorul cadru.
Despre parametrii lui, mai tirziu. Colorit se poate modifica,
de exemplu pentru nuanță rosie, in loc de &HFF00FF scrieti &HFF0000.
Culorile in directx sun in format RGB in baza 16. asa ca &H FF 00 00 inseamna 255 0 0
&H e pentru VisualBasic sa sie ca e in baza 16 (&H - & Hexa)
Aici se incheie primul tutorial despre DirectX si VB. Mai numeroase informatii gasiti pe net,
eu am invatat DX de pe siteul de tutoriale ale lui "Jax Hoxley" din pacate de un timp situl nu mai exista pe net,
dar daca gasiti vreo urma de el, dati-mi un email si mie
Spor la treaba ! (urmatorul tutorial va aparea in curand)
Petru reclamatii, sugestii sau altele scrieti-mi: osvathrobi@hotmail.com
[/code] |
|