1 / 97

Számítógépes Grafika

DirectX 1. gyakorlat. Számítógépes Grafika. 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. Számonkérés. Rendszeres: 2-2 „kisbeadandó” DirectX-ből és OpenGL-ből Évvégi:

Télécharger la présentation

Számítógépes Grafika

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DirectX 1. gyakorlat Számítógépes Grafika

  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

  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=3021d52b-514e-41d3-ad02-438a3ba730ba

  6. Segédanyagok • Alapozó anyagok és egyebek: 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égesfelü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. Miért kellett?DOS-os idők 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 Amiket lefordítja a grafikus kártya driverének „nyelvére” az ún. HAL device A programunkban a Direct3D API által biztosított függvényeket hívhatjuk

  16. Az első DirectX specifikáció alkotói • Alex St. John • Craig Eisler • 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/WinAPI/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ás Futás Kilépés Erőforrások felszabadítása Erőforrások lefoglalása Egyéb inicializálások Reagálás a beérkező üzenetekre Egyéb működés

  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 • intMessageBox( 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ípusokHANDLE • 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ípusokHANDLE • 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ípusokLPCSTR • „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ípusokLPCTSTR • 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: • #ifdefUNICODEtypedefWCHARTCHAR;#elsetypedefcharTCHAR;#endif

  45. TípusokWCHAR • A WCHAR egy kétbájtos változó (pontosabban ő is egy typedef az unsigned short-ra): typedefwchar_tWCHAR;

  46. TípusokSzö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: #undefUNICODE

  47. TípusokSzö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 • intWINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) • A visszatérési érték funkciója ugyanaz, mint a konzolos main esetén

More Related