http://alpha-thema-online.uv.ro
Fa-ti si tu propriul forum, pe www.myforum.ro!
Pagina de start a forumului http://alpha-thema-online.uv.ro Autentificare Inregistrare FAQ Membri Cautare

Pagina de start a forumului http://alpha-thema-online.uv.ro » Visual Studio » DirectX and VisualBasic - Tutorial 1 - Simple D3D Window VB
Creaza un subiect nou  Raspunde la subiect Subiectul anterior :: Subiectul urmator 
DirectX and VisualBasic - Tutorial 1 - Simple D3D Window VB
MesajTrimis: 19/07/2007 17:23 Raspunde cu citat (quote)
Ad_Infinitum
Administrator
Administrator
Ad_Infinitum
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 Smile)
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 Smile

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 Smile

Spor la treaba ! (urmatorul tutorial va aparea in curand)

Petru reclamatii, sugestii sau altele scrieti-mi: osvathrobi@hotmail.com
[/code]
Vezi profilul utilizatorului Trimite mesaj privat

DirectX and VisualBasic - Tutorial 1 - Simple D3D Window VB
 Pagina de start a forumului http://alpha-thema-online.uv.ro » Visual Studio
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Ora este GMT + 3 ore  
Pagina 1 din 1  

  
  
 Creaza un subiect nou  Raspunde la subiect  


Fa-ti si tu propriul forum GRATUIT, pe www.myforum.ro
    Powered by phpBB © 2001-2004 phpBB Group. phpBB Skin by Vjacheslav Trushkin.