Skip to main content

DirectX (Ukázka, strana 99)

Page 1

98

DIRECTX

sprintf(g_tcError,TEXT("Neexistuje objekt Direct3DDevice!")); return (false); } m_lpD3DDevice->Present(NULL, NULL, NULL, NULL); if((m_lpD3DDevice->CreateOffscreenPlainSurface(SCREEN_WIDTH, SCREEN_HEIGHT, d3dFormat, D3DPOOL_DEFAULT, &m_lpBackImage, NULL)) != D3D_OK) { sprintf(g_tcError,TEXT("Nelze vytvořit off-screen surface!")); return (false); } if((D3DXLoadSurfaceFromFile(m_lpBackImage, NULL, NULL, FILEIMAGE, NULL, D3DX_DEFAULT, 0, NULL)) != D3D_OK) { sprintf(g_tcError,TEXT("Nelze načíst obrázek ze souboru!")); return (false); } return (true); } Na začátku máme deklarovány dva identifikátory datových typů D3DPRESENT_PARAMETERS a D3DFORMAT. S oběma jsme se již setkali v předchozích podkapitolách. První představuje strukturu, která obsahuje položky, do nichž se musí vyplnit vlastnosti vytvářeného zařízení. Jedna z nich se týká nastavení barevné hloubky (konkrétně jde o d3dpp.BackBufferFormat). Sem ovšem nemůžeme dosadit jednoduše barevnou hloubku v bitech, tedy 16 nebo 32, ale právě identifikátor typu D3DFORMAT, který jsme si popsali v předchozí kapitole. Všechny formáty a jejich identifikátory se dají najít v DirectX SDK, proto jsme si uvedli jen dva nejčastější (D3DFMT_X8R8G8B8 a D3DFMT_R5G6B5), které nastavujeme právě podle makra SCREEN_WIDTH příkazem: d3dFormat = (SCREEN_WIDTH == 32) ? D3DFMT_X8R8G8B8 : D3DFMT_R5G6B5; Dále funkcí Direct3DCreate9 provedeme vytvoření objektu Direct3D a potom metodou IDirect3D9::CreateDevice vytváříme objekt zobrazovacího zařízení. Nové jsou ale pro nás některé položky struktury typu D3DPRESENT_PARAMETERS, jimiž nastavujeme vlastnosti tohoto zařízení. Již víme, že d3dpp.BackBufferFormat obsahuje identifikátor barevné hloubky. Také jsme si uvedli, že do d3dpp.Windowed ukládáme, zda má být okno aplikace přes celou obrazovku či nikoliv. Zde celoobrazovkovou aplikaci vytváříme, proto je zde nastavena hodnota false. Další položku jsme již také popsali – d3dpp.SwapEffect udává způsob přenášení dat mezi front a back bufferem. Máme pouze jeden back buffer, proto ani nemusíme nastavovat d3dpp.BackBufferCount a můžeme ponechat tuto položku na nule. Následují dvě položky: d3dpp.BackBufferWidth a d3dpp.BackBufferHeight udávají rozměry back bufferu, tedy vlastně i rozlišení obrazovky. U okenních aplikací jsme se o tyto dvě položky nemuseli zajímat, ale zde je to nutné. Do poslední položky (d3dpp.hDeviceWindow) ukládáme handle okna naší aplikace.

4. Direct3D

Ukázka elektronické knihy, UID: KOS180713


DIRECTX

99

Po vytvoření obrazovky se back buffer vyplní černou barvou a zobrazí se. Tato část kódu by tu pochopitelně být nemusela, protože hned v dalších krocích vytváříme off-screen surface a do něj načítáme obrázek. Potom se bude za běhu programu obrázek nahrávat do back bufferu, takže se tímto obrázkem celé černé pozadí překreslí. Vytváření off-screen surface provádí metoda IDirect3DDevice9::CreateOffscreenPlainSurface, jejíž syntaxe je následující: HRESULT IDirect3DDevice9::CreateOffscreenPlainSurface( UINT Width, UINT Height, D3DFORMAT Format, DWORD Pool, IDirect3DSurface9** ppSurface, HANDLE* pSharedHandle ); První dva parametry udávají šířku a výšku surface. Protože obrázek překryje celou obrazovku, nastavujeme mu rozměry SCREEN_WIDTH a SCREEN_HEIGHT. Třetím argumentem je barevný režim, který bude stejný jako u front a back bufferu a máme ho uložený v položce d3dFormat. Čtvrtým parametrem je tzv. pool, neboli typ paměti, kam má být surface uložen. Identifikátor D3DPOOL_DEFAULT říká, že bude umístěn do paměti, která se pro daný účel hodí. Nejčastěji je použita paměť na grafické kartě, což má výhodu v rychlejším přístupu. Nevýhodou naopak je to, že se data mohou ztratit, a v takovém případě se musí vše zrušit a zase vytvořit. Pátým parametrem je adresa, kam se uloží ukazatel na nově vzniklý surface. Poslední parametr se v současné době nepoužívá a má vždy hodnotu NULL. Jakmile je surface vytvořený, můžeme na něj uložit obrázek. Načtení ze souboru provádí funkce D3DXLoadSurfaceFromFile, o níž jsme si řekli, že je definovaná v hlavičkovém souboru d3dx9.h. Tato funkce má celkem osm parametrů:

4. Direct3D

HRESULT D3DXLoadSurfaceFromFile ( LPDIRECT3DSURFACE9 pDestSurface, CONST PALETTEENTRY* pDestPalette, CONST RECT* pDestRect, LPCTSTR pSrcFile, CONST RECT* pSrcRect, DWORD Filter, D3DCOLOR ColorKey, D3DXIMAGE_INFO* pSrcInfo ); První parametr je ukazatel na objekt rozhraní IDirect3DSurface9, do kterého má být obrázek načten. Druhým parametrem je ukazatel na strukturu typu PALETTEENTRY, kam se má ukládat paleta barev. Paleta barev se používá pro obrázky s 256 barvami, tedy takové, které mají 8bitovou barevnou hloubkou. My máme větší barevnou hloubku, proto v našem programu použijeme hodnotu NULL (žádná paleta barev není). Dále následuje ukazatel na strukturu typu RECT, tedy obdélníkovou oblast. To se používá v případě, že chceme nahrát bitmapu na konkrétní místo surface (rozměry bitmapy mohou být menší). Nám ale bitmapa zabere celý obsah surface a v takovém případě se tento parametr nastavuje na NULL. Čtvrtý parametr je textový řetězec, ve kterém je uložena cesta k souboru, ze kterého se má obrázek načíst. V našem případě toto udává makro FILEIMAGE. Přitom je podporováno jen několik poměrně hodně rozšířených formátů rastrových souborů – například *.bmp, *.png nebo *.jpg.

4.4 Surfaces v Direct3D

Ukázka elektronické knihy, UID: KOS180713


100

DIRECTX

Pátým parametrem je opět ukazatel na strukturu typu RECT. Tentokrát ovšem představuje obdélníkovou oblast zdrojového obrázku, která se má načíst. Jinými slovy, obrázek se nemusí načíst celý, ale jen jeho část, kterou touto strukturou definujeme. My však chceme načíst obrázek celý, a v takovém případě se tento parametr opět nastavuje na NULL. Následuje parametr DWORD Filter. Ten představuje sérii příznaků (filtrů), které se mají na přenášená data aplikovat. Tímto způsobem může docházet při přenosu k jisté modifikaci. Často se na místě tohoto argumentu používá symbolická konstanta D3DX_DEFAULT. Předposlední hodnota je tzv. barevný klíč. O tom, co to barevné klíče jsou a o práci s nimi pojednávala podkapitola 3.6. Stručně řečeno, můžeme zde nastavit jednu barvu, která bude brána jako průhledná, tedy přenášený obrázek nemusí být obdélníkový. Pokud chceme obdélníkový přenos a žádný barevný klíč není, dosazujeme zde hodnotu NULL. Poslední parametr je ukazatel na strukturu typu D3DXIMAGE_INFO, která obsahuje informace o obrázku (rozměry obrázku, barevná hloubka apod.). Tyto informace se doplní po zavolání funkce D3DXLoadSurfaceFromFile. Pokud tyto informace nepotřebujeme, můžeme zde také dosadit hodnotu NULL. Zbývá nám popsat poslední dvě metody. CWindow::UpdateFrame a CWindow::Restore. Zde je výpis první z nich: void CWindow::UpdateFrame(void) { LPDIRECT3DSURFACE9 lpBackBuffer; HRESULT d3dval; if((d3dval = m_lpD3DDevice->TestCooperativeLevel()) != D3D_OK) { if(d3dval == D3DERR_DEVICELOST) return; if(d3dval == D3DERR_DEVICENOTRESET) { Restore(); /* Terminate(); if(!InitializeDirect3D()) PostQuitMessage(0);*/ return; } } if((m_lpD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &lpBackBuffer)) != D3D_OK) { sprintf(g_tcError,TEXT("Nelze získat ukazatel na back buffer!")); PostQuitMessage(0); } if((m_lpD3DDevice->StretchRect(m_lpBackImage, NULL, lpBackBuffer, NULL, D3DTEXF_NONE)) != D3D_OK) { sprintf(g_tcError,TEXT("Nelze zkopirovat obrázek do back bufferu!")); PostQuitMessage(0); }

4. Direct3D

Ukázka elektronické knihy, UID: KOS180713


Turn static files into dynamic content formats.

Create a flipbook
DirectX (Ukázka, strana 99) by Kosmas-CZ - Issuu