Ostatný diel bol zameraný na nastavenie vývojového prostredia pre DirectX. V dnešnom diele sa zameriam na inicializáciu Direct3D a dozviete sa množstvo nových informácii.
Terminológia
Device (zariadenie): Pod týmto pojmom sa v Direct3D rozumie či už fyzická, alebo logická grafická karta. Fyzická je taká, ktorú máte nainštalovanú v počítači. Aj ako logická sa tvári vtedy, keď má dva výstupy na monitor, resp. televízor a podobne. Fyzická a logická sa od seba líšia funkcionalitov. K tomu sa však dostaneme asi až niekedy neskôr.
Page flipping (Page swapping) Je jedna z metod, ktorou sa obraz dostava na obrazovku. Funguje to tak, že sa vytovria dva buffery. Obraz sa zapise do jedneho z nich. Keď sa má renderovať, tak sa obsahy bufferov prehodia. Na obrazovku sa tak dostane buffer, v ktorom sú zapísané obrazové dáta, čiže jednotlivé pixely. Druhý buffer sa vyčistí a je pripravený na zápis. Takto sa to neustále opakuje. Je to jednoducho ako princíp otáčania strán v knihe. Keď sú k dispozícii dva buffery nazývame to double buffering. Keď sú buffery tri, ide o triple buffering. Buffer, ktorého obsah sa vykresľuje na obrazovku sa nazýva front buffer, ostatné sú back buffery. Keby neexistovala táto technika, tak by všetky objekty za sebou nechávali "šmuhy" na tom mieste, kde sa naposledy nachádzali.
Game loop Game loop je programový cyklus, ktorý sa opakuje, až kým sa hra nemá ukončiť. V ňom prebieha všetko vykresľovanie, spracúvanie fyziky, zvukov a ostatné programové operácie.
Matrics (matice) N krát M rozmerné pole. Maticiam venujem jeden samostatný článok, pretože na pochopenie sú trošku zložitejšie, ale ak chcete vytoriť nejaký poriadnejší 3D program, budete ich musieť ovládať.
LPDIRECT3D8 Direct3DCreate8( UINT verzia_SDK ) verzia_SDK: Vždy nastavte na D3D_SDK_VERSION.Keď si ho inicializujete Direct3D, tak treba incializovať device. Na to slúži funkcia CreateDevice.
HRESULT LPDIRECT3D8::CreateDevice( UINT Adapter, D3DDEVTYPE DevType, HWND Okno, DWORD Parametre, *D3DPRESENT_PARAMETERS Parametre_obrazu, *LPDIRECT3DDEVICE8 Device ) Adapter: Ako parameter zatiaľ zadávajte D3DADAPTER_DEFAULT DevType: Typ devicu. Máte dve možnosti: D3DDEVTYPE_HAL a REF. Keď zadáte HAL, tak budete mať k dispozícii plnú akceleráciu grafiky grafickou kartou. Keď zadáte REF veziu, tak sa všetko bude vykonávať softvérovo. REF verziu sa oplatí používať vtedy, keď potrebujete v rámci kompatibility napísať nejaké funkcie na spracovanie grafiky. Okno: Okno, do ktorého sa bude vykresľovať. Parametere: Sem budeme zadávať D3DCREATE_SOFTWARE, resp. HARDWARE_VERTEXPROCESSING. Keď zadáte SOFTWARE, tak sa budú vertexy spracúvať softvérovo, v pačnom prípade ich bude spracúvať grafická karta. Existuje ešte aj možnosť MIXED, o tej si však povieme niekedy neskôr (ak vôbec). Keď inicializujete device, tak sa oplatí otestovať, či grafická karta podporuje vami vybranú verziu vertex processingu. Parametre_obrazu: Dátová štruktúra, ktorá obsahuje informácie o tom, ako sa má device inicializovať. Device: Odkaz na device, ktorý sa má práve vytvoriť.Pozastavím sa pri D3DPRESENT_PARAMETERS. Je to dátová štruktúra obsahujúca niekoľko členov. Mojim cieľom nie je ich všetky vysvetliť (bolo by to zbytočne zdĺhavé), preto vám odporúčam pozrieť sa do dokumentácie DirectX. Nemusíte sa však obávať, že by som nič nevysvetlil. Vysvetlím jednoducho tie parametre, s ktorými budeme pracovať, čiže časom možno aj všetky.
LPDIRECT3D8 lpD3D; // direct3D LPDIRECT3DDEVICE8 lpDev; // device ... lpD3D = Direct3DCreate8(D3D_SDK_VERSION); D3DPRESENT_PARAMETERS d3dPP; ZeroMemory(&d3dPP,sizeof(d3dPP)); d3dPP.Windowed = true; // true - oknový režím d3dPP.hDeviceWindowed = hMainWindow; // okno aplikácie d3dPP.BackBufferCount = 1; // pocet backbufferov, 1, čiže double buffering d3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD; lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dPP, &lpDev);Touto postupnosťou príkazov by sme mali inicializovalizované nutné minimum Direct3D8.
HRESULT LPDIRECT3DDEVICE8::Clear( DWORD count, const D3DRECT rect, DWORD flags, D3DCOLOR color, float z, DWORD stencil ) Count, Rect: Tieto parametre nastavte zatiaľ na NULL, resp. 0. Flags: D3DCLEAR_TARGET - pri vykresľovaní každého framu za vymaže obrazová plocha Color: Farba, ktorou sa bude buffer mazať. Môžeme ju zadať buď hexadecimálnou hodnotou (napr. 0x00FFFFFF pre bielu farbu), ale makrom D3DCOLOR_XRGB(r,g,b). Z Keďže táto hodnota je normalizovaná, môže byť od 0 do 1. 1 znamená, že sa vyčistí celý backbuffer, 0 znamená, že sa čistiť nebude vôbec. Stencil: Tento parameter nastavte na 0, resp. NULL.Ako ste už asi zistili, Clear() slúži na vyčistenie aktívneho buffera.
lpDev->Clear(0, NULL, D3DCLEAR_TARGET, 0x00ffffff, 1.0f, 0); lpDev->BeginScene(); // v tejto oblasti môže prebiehať vykresľovanie lpDev->EndScene(); lpDev->Present(NULL,NULL,NULL,NULL);Záver