Direct 3D - Vytvorenie prázdnej 3D scény
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.