Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaÁgoston Szilágyi Megváltozta több, mint 10 éve
1
Számítógépes Grafika DirectX 1. gyakorlat
2
Információk Előfeltételek: Linalg (erős) C++ (gyenge) A gyakorlat két részből áll 6 (7) hét DirectX 6 (5) hét OpenGL
3
Számonkérés Rendszeres: 2-2 „kisbeadandó” DirectX-ből és OpenGL-ből Évvégi: Géptermi zárthelyi – egy sorsolt API-ban feladat A kisbeadandó pontok beszámítanak a géptermibe Beadandó: géptermit kiváltó, egy adott feladat DirectX ÉS OpenGL alatt történő megvalósítása Csak a kis beadandókkal bizonyos pontszámot elérő hallgatóknak
4
Információk A DirectX-es gyakorlati diák és példaprogramok innen érhetőek el: http://cg.elte.hu/~valasek Kérdések a gyakorlattal kapcsolatban: valasek@inf.elte.hu valasek@inf.elte.hu
5
Mire lesz szükség? Visual Studio 2010 http://msdnaa.elte.hu DirectX SDK (2010 júniusi a ZH pack, de lehet későbbit is használni): http://www.microsoft.com/downloads/en/details.aspx?FamilyID=3021d52 b-514e-41d3-ad02-438a3ba730ba http://www.microsoft.com/downloads/en/details.aspx?FamilyID=3021d52 b-514e-41d3-ad02-438a3ba730ba
6
Segédanyagok Alapozó anyagok és egyebek: http://cg.elte.hu/index.php/bsc-grafika- gyakorlatok http://cg.elte.hu/index.php/bsc-grafika- gyakorlatok
7
Opcionális irodalom Nyisztor Károly: Shaderprogramozás
8
Tartalom 1. DirectX általános áttekintése 2. WinAPI 3. A keretrendszer
9
Mi a DirectX? A DirectX a multimédiás fejlesztéseket segítő API-k gyűjteménye Minden API gyors hozzáférést biztosít a hardverhez Vagyis alapvetően olyan egységes felületeket biztosít, amelyeken keresztül lehetővé válik a különböző típusú hardverek hatékony elérése
10
Mi a DirectX? A DirectX tehát API-kat biztosít például grafikus különböző bemeneti illetve audio eszközök hatékony programozására
11
Miért kellett? DOS-os idők
12
Pro: Hatékony hardver-elérés (nincsenek rétegek az alkalmazás és a program között) „Bármit” megtehetünk Kontra: Rendkívül időigényes (ha két HW másképp biztosít egy szolgáltatást, akkor mindkettő módon le kell kódolni)
13
Miért kellett? Windows Windows 3.1: Megszűnik a hardver közvetlen elérhetősége Nem született életképes alternatíva a hatékony elérésre Windows 95: Windows Games SDK (feat. DirectX 1.0)
14
Miért nem az OpenGL? A Windows NT-ben már volt OpenGL támogatás még mielőtt kidolgozták volna a DirectX-et –tovább lehetett volna ezt is vinni Viszont ezt csak a mérnöki és CAD rendszerek erős hardvereivel lehetett akkoriban (ki)használni A DirectX-et azonban arra szánták, hogy minél több gépen, minél gyorsabb programot lehessen írni (=> nehézkesebb programozás kezdetben)
15
DirectX Graphics felépítése Ezt írjuk mi A programunkban a Direct3D API által biztosított függvényeket hívhatjuk Amiket lefordítja a grafikus kártya driverének „nyelvére” az ún. HAL device
16
Az első DirectX specifikáció alkotói Craig Eisler Alex St. John Eric Ergstrom
17
DirectX verziók 1/ 5 1.0: rengeteg hiba (de: Pitfall, EarthWorm Jim) 2.0: instabil, még mindig rengeteg hiba 3.0a: a későbbi Win95, illetve WinNT része. Nőtt a driver támogatottság, de az API-k hirtelen változtatásait a programozók nehezen követték 4.0: ez a verzió kimaradt
18
DirectX verziók 2/ 5 5.0: lényegesen fejlesztő közelibb, ActiveX control- ok. Sokkal mélyebben épül bele az operációs rendszerbe (Win98) 6.1a: Win98SE, további fejlesztések és javítások, RM és IM 7.0: szorosabb együttműködés a szoftver- és hardverfejlesztőkkel (elfogadja az ipar), Retained Mode-ot befagyasztják, textúrázást átdolgozzák (ipari javaslatra) stb.
19
DirectX verziók 3/ 5 8.0: nagy fejlesztések, átalakítások: Az addig különválasztott 2D-s (DirectDraw) és 3D-s (Direct3D) részeket összevonták (DirectX Graphics) Point-sprite-ok 3D-s textúrák Továbbfejlesztett D3DX könyvtár (!) => az RM-hez hasonló magasabb szintű szemlélet teljesítményvesztés nélkül N-patch-ek Vertex és Pixel (pontosabban Fragment) Shader-ek
20
DirectX verziók 4/ 5 9.0: alapvetően a 8.1 továbbfejlesztése Újabb shader verziók és a HLSL támogatása Kiforrott framework (ld. SDK dokumentációjában DXUT Programming Guide) További apróbb fejlesztések Mi ezzel foglalkozunk és a gyakorlat diái mind erről a verzióról fognak szólni.
21
DirectX verziók 5/ 5 10.0, 10.1: a Vista driver modelljéhez igazítás Geometry shaderek megjelenése, ő már írhat a memóriába Hardverek megkötése (nem kell Caps-eket nézni – elvileg) DX9 (XP-s viselkedés), DX9Ex (ő már WDDM, már ha van driver), DX10 SM 4.0 (illetve 10.1-ben 4.1) 11: új shaderek, általános számítások shadertámogatása stb.
22
A DirectX 9 jelenlegi komponensei DirectX Graphics: 2D és 3D-s grafikus megjelenítés DirectX Input: (DirectInput) bemeneti eszközök kezelése (egér, billentyűzet, joystick stb) DirectX Audio: (DirectSound) audio fejlesztéshez, hang lejátszás és felvétel
23
Tartalom 1. DirectX általános áttekintése 2. WinAPI 3. A keretrendszer
24
Ajánlott irodalom Charles Petzold: Programming Windows 2006-os WinAPI alapozó anyag: http://people.inf.elte.hu/z_farkas/OS/2007/Wi nAPI/Index-Intro.html http://people.inf.elte.hu/z_farkas/OS/2007/Wi nAPI/Index-Intro.html
25
Mi a WinAPI? A WinAPI olyan függvények gyűjteménye, amelyeken keresztül az operációs rendszer szolgáltatásait vehetjük igénybe Szolgáltatásokat, mint például memóriakezelés, I/O, energiagazdálkodás, felhasználói felület kezelés, halózati kezelés, biztonság stb.
26
Megvalósítás Dinamikus szerkesztésű könyvtárakkal (DLL- ek) Mi a C-s, alap függvénykészletet használjuk Különböző wrapperek is vannak a kényelmesebb használat érdekében, C++- hoz például MFC, ATL, WTL stb. Ugyanis kissé nehézkes a programozása:
27
Charles Petzold: Programming Microsoft Windows with C# "The original hello-world program in the Windows 1.0 SDK was a bit of a scandal. HELLO.C was about 150 lines long, and the HELLO.RC resource script had another 20 or so more lines. (...) Veteran C programmers often curled up in horror or laughter when encountering the Windows hello-world program."
28
Egy Windows program vázlata InicializálásFutásKilépés Erőforrások lefoglalása Egyéb inicializálások Reagálás a beérkező üzenetekre Egyéb működés Erőforrások felszabadítása
29
Inicializálás A megszokott inicializáláson kívül még néhány Windows-os dolgot is el kell intézni Ablakosztály regisztrálása, üzenetkezelők beállítása stb.
30
Futás A Windows-ban az eseménykezelés üzenet alapú Ha történik valami az alkalmazásunkkal (például az ablakot átmeretezik), akkor a rendszer küld egy üzenetet erről nekünk Megadhatunk egy függvényt, ami kezeli ezeket a beérkező rendszerüzeneteket (ha nem tesszük, akkor az alapértelmezett fut)
31
Kilépés A beérkező üzenetek feldolgozását egy üzenetfeldolgozó ciklusban végezzük
32
1. példa Egy egyszerű „Helló Világ”
33
A program Először nézzük, hogy milyen egy nagyon egyszerű „Helló Világ” program Egyetlen WinAPI hívást fogunk használni, ami egy ilyen típusú szövegablakot fog megjeleníteni:
34
MessageBox int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); Visszatérési érték: a lenyomott gombnak megfelelő érték
35
Magyar jelölés Változónevek első néhány karaktere a változó típusára utal, például p a pointerre, i az integerre, b a bool-ra, h a handle-re, sz a 0-ra végződő stringre (char*), stb. Microsoft mindenütt alkalmazza (Simonyi Károly után kapta nevét ez a jelölésmód), ezért érdemes legalábbis ismerni - ha használni nem is
36
MessageBox int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); hWnd: a megjelenítendő szöveges ablak szülő ablakának kezelője, ha értéke NULL, akkor nincs szülő
37
MessageBox int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); lpText: a megjelenítendő szöveg
38
MessageBox int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); lpCaption: az ablak fejlécének szövege
39
MessageBox int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); uType: a megjelenő ablak típusa (milyen gombok legyenek rajta, viselkedés,...), ha 0 (ami egyúttal az MB_OK értéke is), akkor csak egy OK gomb lesz
40
Kérdések De mi a HWND, LPCTSTR, UINT? WinAPI-ban általában a típusneveket csupa nagybetűvel írjuk
41
Típusok HANDLE HANDLE: minden objektum létrehozásakor a Windows kioszt egy egyedi azonosítót, úgynevezett leírót az új objektumnak 32 bites Windows alatt ez 4 bájtos, 64 bites alatt pedig 8 bájtos (typedef a void*-ra) A leíró több mint egy puszta azonosító (pl. process id): azonosító ismeretében pl. csak üzenhetünk, leíró ismeretében akár meg is szüntethetünk (megfelelő jogosultságok esetén)
42
Típusok HANDLE A HANDLE egy általános leíró, bármié lehet A következőknél adott, hogy milyen típusú dolgok leírói: HWND: ablakleíró, nem csak a „form”-ok, hanem a gombok, beviteli mezők, panelek,... HINSTANCE: egy futó process leírója HDC: egy ablak rajzterületének leírója
43
Típusok LPCSTR „Long Pointer to Constant String” Az LP-ből az L csak történeti hagyaték String: ANSI karakterlánc, C stílusú, azaz karakterek olyan tömbje, amit 0 zár le VS-ben jobb klikk egy LPCSTR szövegen és ott Goto Declaration:
44
Típusok LPCTSTR Mutató TCHAR-ok 0-val végződő láncára A TCHAR tényleges típusa attól függ, hogy UNICODE kódolást használ-e a programunk vagy sem: #ifdef UNICODE typedef WCHAR TCHAR; #else typedef char TCHAR; #endif
45
Típusok WCHAR A WCHAR egy kétbájtos változó (pontosabban ő is egy typedef az unsigned short-ra): typedef wchar_t WCHAR;
46
Típusok Szöveg megadása ANSI változatú szöveg ( char -ok tömbje): "Valami szöveg..." UNICODE változatú szöveg ( wchar_t -k tömbje): L"Valami szöveg...” A UNICODE alapértelmezett VS2005-ben, kikapcsolni így lehet: #undef UNICODE
47
Típusok Szöveg megadása Karakterláncokat a legegyszerűbb a TEXT makró segítségével megadni, így nem kell törődnünk azzal, hogy éppen UNICODE-os az alkalmazás vagy sem: TEXT("Valami szöveg..."); Arra vigyázzunk, hogy amikor explicit adott, hogy mit kérnek, ne használjuk a TEXT makrót!
48
MessageBox használata Tehát a szövegkiírás így néz ki: MessageBox( NULL, TEXT("Helló világ!"), TEXT("Üzenet"), MB_OK); De hová írjuk ezt be?
49
WinMain Amikor konzolos alkalmazást írunk, akkor a programunk belépési pontja a main() függvény: int main(int argc, char *argv[]); Ennek Windows-os megfelője a WinMain
50
WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) A visszatérési érték funkciója ugyanaz, mint a konzolos main esetén
51
WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) hInstance: a futó programunk processzének leírója
52
WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) hPrevInstance: ma már NULL-al tölti fel az oprendszer, régebben a programunk egy korábban indított példányának azonosítója került ide
53
WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) cmdLine: a parancssori paraméterek stringje
54
WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) nShow: az alkalmazás főablakának kezdeti megjelenítési (maximalizált, tálcára küldött,...) paraméterei (már ha van ablaka)
55
Függvényhívási konvenciók Egyvalami még magyarázatra szorul a WinMain definíciójával kapcsolatban: int WINAPI WinMain A WINAPI itt egy függvényhívási konvenció megadását jelöli 32 bites Windows-ok alatt a WINAPI a következő makró: #define WINAPI __stdcall
56
Függvényhívási konvenciók Tehát általánosan így adhatjuk meg a függvényeinket: vt K fv(param) {...} vt: visszatérési típus K: konvenció fv: függvénynév param: paraméterek listája
57
Néhány konvenció
58
Mi a WINAPI-n kívül a CALLBACK-et fogjuk csak használni az üzenetkezelő függvényeinknél, ami 32 bites Windows-on így néz ki: #define CALLBACK __stdcall
68
A program #include int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) { MessageBox(NULL, TEXT("Hello világ!"), TEXT("Üzenet"), MB_OK); return 0; }
69
Szövegkezelés Előfordulhat, hogy egy változó értékét akarjuk kiírni Mi most egy formázást használó függvénnyel oldjuk ezt meg: _stprintf_s a tchar.h-ból A t a TCHAR-ra utal, a záró s pedig arra, hogy secure, vagyis azt is megadjuk, hogy maximum milyen hosszú bemenetet engedünk meg
70
_stprintf_s _stprintf_s( TCHAR* _Dst, size_t _SizeInWords, const TCHAR* _FormatString,...) A _Dst egy mutató annak a memóriaterületnek az elejére, ahonnan kezdve _SizeInWords (Word-ökben adott) hosszan a _FormatString-nek megfelelő szöveg kerül
71
_stprintf_s TCHAR* tSzoveg = new TCHAR[255]; int i = 15; _stprintf_s( tSzoveg, 255, TEXT("A változó értéke: %d"), i);
72
_stprintf_s A harmadik paraméterben megadott sztringben %d helyett az i változó értéke fog megjelenni Néhány formázó utasítás: %d: előjeles egész szám (int) %f: lebegőpontos szám (double) %s: string (nullával lezárt)
73
_stprintf_s A formázó stringbe beírt összes formázó utasításhoz kell átadni értékeket a függvényhíváshoz! Vagyis a _stprintf_s függvényhívás vége így kell kinézzen:..., ”%d %f %d”, 4, 3.5f, 2);
74
Feladat Írjuk ki az _stprintf_s felhasználásával két float változó értékét és azok összegét!
75
Tartalom 1. DirectX általános áttekintése 2. WinAPI 3. A keretrendszer
76
DirectX-es keretprogram Elérhető innen: http://cg.elte.hu/~valasek/keretek/DX_Templa te.zip http://cg.elte.hu/~valasek/keretek/DX_Templa te.zip
77
Működése WinMainCDXMyApp cApp; cApp.Run()
78
CDXAppBase Ez az általunk írt program ősosztálya, belőle származtatjuk a programunk „főosztályát” Ő hozza létre igazából az ablakunkat, a DirectX-et ő kapcsolja be és több háttérmechanizmust is adminisztrál Lényegében az inicializációval járó lépéssorozatot fedi el előlünk
79
A lényeg Nekünk a leszármazott osztályban a következő függvényeket kell megvalósítanunk: HRESULTInitD3D(); HRESULTInitDeviceObjects(); VOIDReleaseDeviceObjects(); VOIDCleanUpD3D(); VOIDFrameUpdate(); VOIDRender(); VOID HandleInput();
80
Működése A WinMain-ben létrehozzuk egy példányát az általunk írt CDXMyApp (a CDXAppBase-ből leszármazott) osztálynak Ennek meghívjuk az Initialize() függvényét Ez létrehoz egy ablakot Meghívja az InitD3D() függvényét a CDXMyApp- nak A Run() függvényt hívja meg ezután a WinMain()
81
CDXAppBase::Run() MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else {
82
CDXAppBase::Run() else { FrameUpdate(); RenderBase(); HandleInput(); } CleanUpBaseD3D();
83
Végleges programváz InitD3D InitDeviceObjects FrameUpdateRender CleanUpD3D ReleaseDeviceObjects HandleInput
90
A program váza Ablak létrehozása Direct3D objektum létrehozása Direct3D Device objektum létrehozása Rajzolás Direct3D objektum megsemmisítése Direct3D Device megsemmisítése Ablak törlése Inicializálás Futás „Takarítás”
91
DirectX Graphics felépítése Ezt írjuk mi A programunkban a Direct3D API által biztosított függvényeket hívhatjuk Amiket lefordítja a grafikus kártya driverének „nyelvére” az ún. HAL device
92
DirectX Graphics felépítése Az alkalmazás és a hardver közötti szoftveres réteg két részből áll: Direct3D API HAL
93
Direct3D API A Direct3D API-t programozzuk az alkalmazásunkból Ez felületek és függvények halmaza, amiken keresztül elérhetjük az aktuális DX verzió által nyújtott összes szolgáltatást Azonban ez nem jelenti azt, hogy a hardver is támogatja mindet
94
Hardware Abstraction Layer A HAL-nak köszönhetően vonatkoztathatunk el a tényleges gépi konfigurációtól Rajta keresztül történik a kommunikáció a hardverrel Megtudhatjuk például tőle, hogy milyen szolgáltatásokat valósít meg az aktuális hardver a D3D felületén keresztül elérhetőkből
95
Hardware Abstraction Layer Ugyanis csak azokat a dolgokat tudja „lefordítani” a videókártya nyelvére ez a réteg, amiket meg is valósítanak az adott hardverben Mivel közvetlenül használja a hardver nyújtotta szolgáltatásokat (a DDI-n keresztül), ezért a hardver gyártók fejlesztik (amit ki is használnak, ld. 3D Mark botrányok)
96
Mi van a nem megvalósított szolgáltatásokkal? Úgynevezett pluggable software device- okban minden szoftveresen meg van valósítva Ilyen például az SDK-val jövő Reference Rasterizer Ami tehát az aktuális DX verzió összes szolgáltatását megvalósítja Pontosságra és nem sebességre optimalizált
97
Mi van a nem megvalósított szolgáltatásokkal? Amikor létrehozzuk a Device-ot (ld. később) megadhatjuk, hogy HAL-on vagy Reference Rasterizer-en keresztül dolgozzon-e Illetve ha van, egyéb, harmadik fél által gyártott psd-vel
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.