Vytvoríme si nový projekt (standard EXE). Musíme dať vedieť Visual Basicu, že chceme pristupovať k DirectX. Preto pridáme referenciu “DirectX 8 for Visual Basic Type Library”(project menu -> references ). Ak ju nenájdete v zozname registrovaných referencií, tak sa nachádza v adresáry Windows\System ako Dx8vb.Dll.

A môžeme začať s deklaráciou:

Dim Dx As New DirectX8 'deklaracia DirectX
Dim D3D As Direct3D8 'deklaracia Direct3D
Dim D3DDevice As Direct3DDevice8 'deklaracia Direct3D Device

Nasleduje inicializácia DirectX, Direct3D, D3DDevice:

Set D3D = Dx.Direct3DCreate() 'vytvorenie objektu D3D
Dim Nastavenie_obrazovky As D3DDISPLAYMODE
D3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Nastavenie_obrazovky
Dim D3DWindow As D3DPRESENT_PARAMETERS
With D3DWindow
'Copy_Vsync synchronizuje frekvenciu obrazovky s graf. adapterom(Vertikalna synchronizacia)
.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
'format BackBufferu bude rovnaky ako format obrazovky
.BackBufferFormat = Nastavenie_obrazovky.Format
'Chceme iba jeden Backbuffer(Pri nastaveni D3DSWAPEFFECT_COPY_VSYNC
' moze byt vzdy iba jeden backbuffer)
.BackBufferCount = 1
End With
Set D3DDevice = D3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, _
D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DWindow)

Ak ste si už stiahli príklad a otvorili ho, mohli ste si všimnúť, že napríklad štruktúra D3DDISPLAYMODE nie je deklarovaná. Nie je to potrebné, pretože všetky deklarácie sa nachádzajú už v samotnej knižnici Dx8vb.DLL. Tak napríklad táto deklarácia vyzerá nasledovne:

Type D3DDISPLAYMODE
Format As CONST_D3DFORMAT  'formát obrazovky
Height As Long  'vyska
RefreshRate As Long  'obnovovacia frekvencia
Width As Long  'sirka
End Type

Pomocou GetAdapterDisplayMode získame aktuálne nastavenie obrazovky. Pre nás je dôležitý formát. Existuje mnoho formátov obrazovky (okolo 40). My budeme najčastejšie používať R5G6B5 (5 bitov pre červenú, 6 bitov pre zelenú a 5 bitov pre modrú = spolu 16 bitov) a R8G8B8A8 (8 bitov pre červenú, zelenú, modrú a alpha kanál = spolu 32bitov)

Posledný riadok kódu vytvára D3DDevice, ktorý riadi 90% všetkej 3D činnosti.

Parametre CreateDevice:

Adapter = D3DADAPTER_DEFAULT - použitie defaultného adaptéru. Pozri dodatok.

DeviceType = D3DDEVTYPE_HAL - použite hardérovej podpory HAL. Môžete renderovať aj pomocou softvéru nastavením D3DDEVTYPE_REF. To však neodporúčam, pretože je omnoho pomalšie.

hFocusWindow = hWnd - handle ovládacieho prvku, ktorý bude použitý ako výstup pri renderovaní. V našom prípade je to PictureBox

BehaviorFlags = D3DCREATE_SOFTWARE_VERTEXPROCESSING - softvérová transformácia vertexov. Pokiaľ to hardvér podporuje je výhodnejšie nastaviť D3DCREATE_HARDWARE_VERTEXPROCESSING

PresentationParameters = D3DWindow - štruktúra s parametrami, ktorú sme predtým vytvorili.

Nakoniec príde renderovanie. Opakované volanie procedúry Render zabezpečuje Timer.

D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, RGB(0, 0, 0), 1#, 0
' Zaciatok scény
D3DDevice.BeginScene
' V tomto priklade vytvorime iba prázdnu 3D scenu. Preto tu teraz nic nieje.
' Vsetko co chcete renderovat musi byt tu
' Koniec scény
D3DDevice.EndScene
D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0

Predtým, než čokoľvek zobrazíme na obrazovku, musíme ju vyčistiť. Je to veľmi podobné VB funkcii refresh.

Clear:

rect count = 0 - Počet oblastí,ktoré majú byť vyčistené

clearD3DRect = ByVal 0 - Oblasť je rovná nule, tzn., že bude vyčistený(zmazaný) celý PictureBox

flags = D3DCLEAR_TARGET - V tomto prípade je opäť PictureBox.

color = RBG(0,0,0) - Nová farba oblasti - čierna

zClear = 1# - Nepoužité

stencil = 0 - Nepoužité

Všetko, čo má byť zobrazené na obrazovku, musí byť medzi BeginScene a EndScene.

Doteraz celé renderovanie prebiehalo v BackBuffery. Preto je potrebné vymeniť obsah BackBufferu za FrontBuffer (page flipping) a tým všetko zobraziť na obrazovku.

Present:

SourceRect = ByVal 0 - Zdrojová oblasť. Nula znamená, že zdrojom je celý povrch Pictureboxu

DestRect = Byval 0 - Cieľová oblasť. Opäť celý picturebox

hWndOverride = 0 - Handle. Nula znamená, že bude použité doterajšie handle (handle Pictureboxu)

DirtyRegion = Byval 0 - Nepoužité

Ako všetky objekty aj tieto treba po ukončení programu odstrániť z pamäte.

Set D3DDevice = Nothing
Set D3D = Nothing
Set Dx = Nothing

Dodatok

Adaptér - Obyčajne býva primárny a sekundárny. Primárny je používaný u kombinovaných 2D/3D kariet (TNT, GeForce, Savage4…), kde 2D aj 3D výpočty vykonáva jedna karta. Sekundárny u “nadstavbových” kariet (Voodoo I, II), ktoré sú iba 3D.

Fullscreen - ak chcete aby naša aplikácia bežala na celú obrazovku stačí vykonať iba zopár zmien:

Nastavenie_obrazovky.Format = D3DFMT_R5G6B5
Nastavenie_obrazovky.Width = 640
Nastavenie_obrazovky.Height = 480
D3DWindow.SwapEffect = D3DSWAPEFFECT_FLIP
D3DWindow.BackBufferCount = 1
D3DWindow.BackBufferFormat = Nastavenie_obrazovky.Format
D3DWindow.BackBufferHeight = 480
D3DWindow.BackBufferWidth = 640
D3DWindow.hDeviceWindow = form1.hWnd

Byval - pokiaľ je parameter deklarovaný ako As ANY je potrebné použiť Byval pred hodnotu parametru.

Priložené súbory: