<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html PUBLIC '-//W3C/DTD XHTML+Voice 1.2 /EN' 'http://www.voicexml.org/specs/multimodal/x+v/12/dtd/xhtml+voice12.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ev='http://www.w3.org/2001/xml-events'>
<head>
<link rel='canonical' href='http://pabi3.com/blog/direct3d-2-diel/' />
<link rel='stylesheet' href='http://pabi3.com/modules/items/voice.css' type='text/css' media='all' />
<form xmlns='http://www.w3.org/2001/vxml' id='title'>
<block>
The article Direct3D - 2. diel is written by Ribi
</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='body'>
<block>
Ostatny diel bol zamerany na nastavenie vyvojoveho prostredia pre DirectX. V dnesnom diele sa zameriam na inicializaciu Direct3D a dozviete sa mnozstvo novych informacii.</block>
</form>
<form xmlns='http://www.w3.org/2001/vxml' id='full'>
<block>
Terminologia
 Device (zariadenie):
 Pod tymto pojmom sa v Direct3D rozumie ci uz fyzicka, alebo logicka graficka karta. Fyzicka je taka, ktoru mate nainstalovanu v pocitaci. Aj ako logicka sa tvari vtedy, ked ma dva vystupy na monitor, resp. televizor a podobne. Fyzicka a logicka sa od seba lisia funkcionalitov. K tomu sa vsak dostaneme asi az niekedy neskor. Page flipping (Page swapping)
 Je jedna z metod, ktorou sa obraz dostava na obrazovku. Funguje to tak, ze sa vytovria dva buffery. Obraz sa zapise do jedneho z nich. Ked sa ma renderovat, tak sa obsahy bufferov prehodia. Na obrazovku sa tak dostane buffer, v ktorom su zapisane obrazove data, cize jednotlive pixely. Druhy buffer sa vycisti a je pripraveny na zapis. Takto sa to neustale opakuje. Je to jednoducho ako princip otacania stran v knihe.
 Ked su k dispozicii dva buffery nazyvame to double buffering. Ked su
buffery tri, ide o triple buffering. Buffer, ktoreho obsah sa vykresluje na obrazovku sa nazyva front buffer, ostatne su back buffery.
 Keby neexistovala tato technika, tak by vsetky objekty za sebou nechavali "smuhy" na tom mieste, kde sa naposledy nachadzali. Game loop
 Game loop je programovy cyklus, ktory sa opakuje, az kym sa hra nema ukoncit. V nom prebieha vsetko vykreslovanie, spracuvanie fyziky, zvukov a ostatne programove operacie. Matrics (matice)
 N krat M rozmerne pole. Maticiam venujem jeden samostatny clanok, pretoze na pochopenie su trosku zlozitejsie, ale ak chcete vytorit nejaky poriadnejsi 3D program, budete ich musiet ovladat. Inicializacia Na inicializaciu Direct3D8 sluzi funkcia Direct3DCreate8. LPDIRECT3D8 Direct3DCreate8( UINT verzia_SDK )

 verzia_SDK:
Vzdy nastavte na D3D_SDK_VERSION.
Ked si ho inicializujete Direct3D, tak treba incializovat device. Na to sluzi funkcia CreateDevice. HRESULT LPDIRECT3D8::CreateDevice(
 UINT Adapter,
 D3DDEVTYPE DevType,
 HWND Okno,
 DWORD Parametre,
 *D3DPRESENT_PARAMETERS Parametre_obrazu,
 *LPDIRECT3DDEVICE8 Device
 )

 Adapter:
Ako parameter zatial zadavajte D3DADAPTER_DEFAULT
 DevType:
Typ devicu. Mate dve moznosti: D3DDEVTYPE_HAL a REF. Ked zadate HAL, tak budete mat k dispozicii plnu akceleraciu grafiky grafickou kartou. Ked zadate REF veziu, tak sa vsetko bude vykonavat softverovo. REF verziu sa oplati pouzivat vtedy, ked potrebujete v ramci kompatibility napisat nejake funkcie na spracovanie grafiky.
 Okno:
Okno, do ktoreho sa bude vykreslovat.
 Parametere:
Sem budeme zadavat D3DCREATE_SOFTWARE, resp. HARDWARE_VERTEXPROCESSING.
Ked zadate SOFTWARE, tak sa budu vertexy spracuvat softverovo, v pacnom pripade ich bude spracuvat graficka karta. Existuje este aj moznost MIXED, o tej si vsak povieme niekedy neskor (ak vobec).
 Ked inicializujete device, tak sa oplati otestovat, ci graficka karta podporuje vami vybranu verziu vertex processingu.
 Parametre_obrazu:
Datova struktura, ktora obsahuje informacie o tom, ako sa ma device inicializovat.
 Device:
Odkaz na device, ktory sa ma prave vytvorit. Pozastavim sa pri D3DPRESENT_PARAMETERS. Je to datova struktura obsahujuca niekolko clenov. Mojim cielom nie je ich vsetky vysvetlit (bolo by to zbytocne zdlhave), preto vam odporucam pozriet sa do dokumentacie DirectX. Nemusite sa vsak obavat, ze by som nic nevysvetlil. Vysvetlim jednoducho tie parametre, s ktorymi budeme pracovat, cize casom mozno aj vsetky. Vo vypise nebudem uvadzat zachytavanie chyb, pretoze by zdrojovy kod len
zbytocne predlzovali a komplikovali. V pribalenych zdrojovych kodoch ale budu vsetky chyby osetrovane. Ako by to malo vyzerat LPDIRECT3D8 lpD3D; // direct3D
 LPDIRECT3DDEVICE8 lpDev; // device
 ...
 lpD3D = Direct3DCreate8(D3D_SDK_VERSION);

 D3DPRESENT_PARAMETERS d3dPP;
 ZeroMemory(&amp;d3dPP,sizeof(d3dPP));
 d3dPP.Windowed = true; // true - oknovy rezim
 d3dPP.hDeviceWindowed = hMainWindow; // okno aplikacie
 d3dPP.BackBufferCount = 1; // pocet backbufferov, 1, cize double buffering
 d3dPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
 lpD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWindow, D3DCREATE_HARDWARE_VERTEXPROCESSING, &amp;d3dPP, &amp;lpDev); Touto postupnostou prikazov by sme mali inicializovalizovane nutne minimum Direct3D8. Rendering Rendering je proces, pri ktorom sa na obrazovku vystupneho zariadenia (v nasom
pripade monitora) kresli scena. Od verzie Direct3D8 sa da renderovat velmi jednoducho. Stacia vam na to styri rychlozapamatatelne funkcie. Su nimi Clear(), BeginScene(), EndScene() a Present(). HRESULT LPDIRECT3DDEVICE8::Clear( DWORD count, const D3DRECT rect, DWORD flags, D3DCOLOR color, float z, DWORD stencil )

 Count, Rect:
Tieto parametre nastavte zatial na NULL, resp. 0.
 Flags:
 D3DCLEAR_TARGET - pri vykreslovani kazdeho framu za vymaze obrazova plocha
 Color:
Farba, ktorou sa bude buffer mazat. Mozeme ju zadat bud hexadecimalnou hodnotou (napr. 0x00FFFFFF pre bielu farbu), ale makrom D3DCOLOR_XRGB(r,g,b).
 Z
 Kedze tato hodnota je normalizovana, moze byt od 0 do 1. 1 znamena, ze sa vycisti cely backbuffer, 0 znamena, ze sa cistit nebude vobec.
 Stencil:
Tento parameter nastavte na 0, resp. NULL.
Ako ste uz asi zistili, Clear() sluzi na vycistenie aktivneho buffera. Funkcie BeginScene() a EndScene() sluzia na zacatie, resp. ukoncenie oblasti, v ktorej sa bude renderovat. Tieto funkcie nemaju ziadne parametre. Poslednou je funkcia Present(). Ma styri parametre, ktore mozete s kludnym svedomim nastavit na NULL. Zakladna funkcia na rendering by mohla vyzerat asi takto. lpDev->Clear(0, NULL, D3DCLEAR_TARGET, 0x00ffffff, 1.0f, 0);
 lpDev->BeginScene();
 // v tejto oblasti moze prebiehat vykreslovanie
 lpDev->EndScene();
 lpDev->Present(NULL,NULL,NULL,NULL); Zaver V dnesnom diele sme sa dozvedeli ako Direct3D inicializovat a ako renderovat. Dalsi diel bude zamerany na kreslenie jednoduchych utvarov (primitiv) ako su trojuholniky, stvorce a podobne. Zdrojove kody: Direct3D2.rar</block>
</form>
<base href='http://pabi3.com/' />
<title>Direct3D - 2. diel</title>
</head>
<body ev:event='load' ev:handler='#title'>
<a href='http://pabi3.com/blog/direct3d-2-diel/' title='Návrat'>Návrat</a>
<h1 style='padding:0.5em;'>Direct3D - 2. diel</h1>
<ul>
<li ev:event='click' ev:handler='#body'>Speak introduction</li>
<li ev:event='click' ev:handler='#full'>Speak full</li>
</ul>
</body>
</html>

