Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 felhasználása számítógépes grafikában (bevezető egy primitív keretrendszer)

Hasonló dokumentumok
Farkas Gyula Szakkollégium Bit- és számtologatók. DirectX9 1. Szín, fény, textúra 2. Stencil buffer használata (tükörkép, hamis árnyék)

Programozás I. Keresztes Barna

Bevezetés a C++ programozási nyelvbe

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

117. AA Megoldó Alfréd AA 117.

Információs Technológia

Programozás 5. Dr. Iványi Péter

Tervminták a valósidejű gyakorlatban

Tartalomjegyzék. Köszönetnyilvánítás... xv. Előszó... xvii. 1. Bevezető D-történelem Matematikai alapok... 7

Számítógépes grafika

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Információs Technológia

Körkörös listák. fej. utolsó. utolsó. fej

Informatika terméktervezőknek

C# osztályok. Krizsán Zoltán

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Internet technológiák

Fejezetek a számítógépi grafikából

Bevezetés a mikrovezérlők programozásába: WS2812 RGB LED-ek vezérlése

Programozás II gyakorlat. 4. Öröklődés

Grafikus felületek készítése 1.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

3. Gyakorlat Ismerkedés a Java nyelvvel

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

C# gyorstalpaló. Készítette: Major Péter

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Országzászlók (2015. május 27., Sz14)

Bevezetés a programozásba 2

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

1. Alapok. Programozás II

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

A Windows alkalmazásfejlesztés rövid története

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

MSP430 programozás Energia környezetben. Nokia 5110 grafikus kijelzo vezérlése

Stack Vezérlés szerkezet Adat 2.

INFORMATIKAI ALAPISMERETEK

A C# programozási nyelv alapjai

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

2D képszintézis. Szirmay-Kalos László

INFORMATIKAI ALAPISMERETEK

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Számítógépes grafika

Objektumorientált programozás C# nyelven III.

A keretrendszer. A linuxos keretrendszer az eredeti alapján készült (nagyrészt C++-ban), ezért nagyjából azzal azonos funkcionalitásokkal rendelkezik.

A C# PROGRAMOZÁSI NYELV

Java II. I A Java programozási nyelv alapelemei

A MATLAB programozása. Féléves házifeladat. RGBdialog

ScopeImage 9.0. Kamera és képfeldolgozó szoftver. Felhasználói kézikönyv

Bevezetés a C++ programozásba

libgdx alapok, első alkalmazás

Programozás C++ -ban 2007/4

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Objektumorientált programozás C# nyelven

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

MSP430 programozás Energia környezetben

VISUAL BASIC ALAPISMERETEK

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

Máté: Számítógépes grafika alapjai

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Java II. I A Java programozási nyelv alapelemei

Programozás II. ATM példa Dr. Iványi Péter

D3D, DXUT primer. Grafikus játékok fejlesztése Szécsi László t01-system

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

Felhasználó által definiált adattípus

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

boolean motoros_szelep_vegallas_el = true; boolean serial_adatok_kikuldese = true; // ************ Hőmérséklet érzékelők Dallasos!!!!

Géptermi zh-írás forgatókönyve

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

ADATBÁZISKEZELÉS KÖZVETLEN ELÉRÉSSEL II...2

C# feladatok gyűjteménye

Objektumorientált programozás C# nyelven

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Bánsághi Anna

libgdx Android Studio alatt

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Google Summer of Code OpenCL image support for the r600g driver

Objektumorientált programozás C# nyelven

Készült a devportal.hu támogatásával. A könyv nyomtatott verziója megvásárolható a könyvesboltokban, és a kiadó webáruházában:

Plakátok, részecskerendszerek. Szécsi László

1. Feladat: Lista mysql BANK UGYFEL

VB C++ C# JScript J# Common Language Specification. ADO.NET and XML. Base Class Library. Common Language Runtime. Operating System

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

3. Osztályok II. Programozás II

Számítógépes grafika

Konkurens TCP Szerver

HLSL programozás. Grafikus játékok fejlesztése Szécsi László t06-hlsl

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Eseménykezelés. Aszinkron kommunikáció

Tartalomjegyzék. Bevezetés...2

Szoftvertechnológia alapjai Java előadások

Átírás:

Farkas Gyula Szakkollégium Bit- és számtologatók DirectX9 felhasználása számítógépes grafikában (bevezető egy primitív keretrendszer) 2006. április 26. Róth Ágoston

DirectX 9.0 SDK telepítése után A fejlesztői környezeten (VC++ 7.0) belül: Tools/Options/Projects Folder/VC++ Directories DirectX9 fejléc (*.h) és könyvtár (*.lib) állományainak elérési útvonala

New Win32 Project d3dinit az új projektünk neve

d3dinit üres projekt (az egyszerűség kedvéért)

d3dinit függőségek beállítása A fejlesztői környezet Project/Properties/Linker Folder/Input menüpontját kiválasztva...

d3dutility.h #include <d3dx9.h> #include <string> namespace d3d bool InitD3D( HINSTANCE hinstance, // [be] alkalmazás példánya int width, int height, // [be] az ablak mérete/backbuffer mérete bool windowed, // [be] ablakozott (true) vagy teljes képernyős (false) D3DDEVTYPE devicetype, // [be] HAL vagy REF IDirect3DDevice9** device);// [ki] a létrehozott eszköz int EnterMsgLoop( bool (*ptr_display)(float timedelta)); LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); template<class T> void Release(T t) if( t ) t->release(); t = 0; template<class T> void Delete(T t) if( t ) delete t; t = 0;

d3dutility.cpp, d3d::initd3d(...) 0. lépés bool d3d::initd3d( HINSTANCE hinstance, int width, int height, bool windowed, D3DDEVTYPE devicetype, IDirect3DDevice9** device) // 0. lépés: létrehozzuk az alkalmazás fő ablakát (ez a rész független DirectX-től) WNDCLASS wc; wc.style = CS_HREDRAW CS_VREDRAW; wc.lpfnwndproc = (WNDPROC) d3d::wndproc; wc.cbclsextra = 0; wc.cbwndextra = 0; wc.hinstance = hinstance; wc.hicon = LoadIcon(0, IDI_APPLICATION); wc.hcursor = LoadCursor(0, IDC_ARROW); wc.hbrbackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszmenuname = 0; wc.lpszclassname = "Direct3D9App"; if(!registerclass(&wc) ) ::MessageBox(0, "RegisterClass() - FAILED", 0, 0); return false; HWND hwnd = 0; hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App", WS_EX_TOPMOST, 0, 0, width, height, 0 /*parent hwnd*/, 0 /* menu */, hinstance, 0 /*extra*/); if(!hwnd ) ::MessageBox(0, "CreateWindow() - FAILED", 0, 0); return false; ::ShowWindow(hwnd, SW_SHOW); ::UpdateWindow(hwnd);

d3dutility.cpp, d3d::initd3d(...) 1., 2., 3. lépés // a D3D tényleges inicializálása HRESULT hr = 0; // 1. lépés: létrehozzuk az IDirect3D9 objektumot IDirect3D9* d3d9 = 0; d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if(!d3d9 ) ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0); return false; // 2. lépés: ellenőrizzük, hogy a videokártya képes-e a vertexek hardwares feldolgozására D3DCAPS9 caps; // egy képességek/lehetőségek-struktúra d3d9->getdevicecaps(d3dadapter_default, devicetype, &caps); int vp = 0; if( caps.devcaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; // 3. lépés: kitöltünk egy D3DPRESENT_PARAMETERS struktúrát D3DPRESENT_PARAMETERS d3dpp; // megjelenítő paraméterek d3dpp.backbufferwidth = width; d3dpp.backbufferheight = height; d3dpp.backbufferformat = D3DFMT_A8R8G8B8; //pixelek szerkezete (4 x 8 bit alpha, red, green, blue) d3dpp.backbuffercount = 1; d3dpp.multisampletype = D3DMULTISAMPLE_NONE; d3dpp.multisamplequality = 0; d3dpp.swapeffect = D3DSWAPEFFECT_DISCARD; d3dpp.hdevicewindow = hwnd; d3dpp.windowed = windowed; d3dpp.enableautodepthstencil = true; d3dpp.autodepthstencilformat = D3DFMT_D24S8; //mélység-buffer szerkezete (24 bit depth, 8 bit stencil) d3dpp.flags = 0; d3dpp.fullscreen_refreshrateinhz = D3DPRESENT_RATE_DEFAULT; d3dpp.presentationinterval = D3DPRESENT_INTERVAL_IMMEDIATE;

d3dutility.cpp, d3d::initd3d(...) 4. lépés // 4. lépés: létrehozzuk az eszközt hr = d3d9->createdevice( D3DADAPTER_DEFAULT, // elsődleges adapter (videokártya) devicetype, // eszköz típusa hwnd, // az eszközhöz társított ablak vp, // vertexek feldolgozása &d3dpp, // megjelenítő paraméterek device); // a létrehozandó eszköz if( FAILED(hr) ) // újból próbálkozunk, de most csak egy 16 bites mélység-bufferrel d3dpp.autodepthstencilformat = D3DFMT_D16; hr = d3d9->createdevice( D3DADAPTER_DEFAULT, devicetype, hwnd, vp, &d3dpp, device); if( FAILED(hr) ) d3d9->release(); // felszabadítjuk a d3d9 objektumot ::MessageBox(0, "CreateDevice() - FAILED", 0, 0); return false; d3d9->release(); // felszabadítjuk a d3d9 objektumot return true;

d3dutility.cpp, d3d::entermsgloop(...) // ez a függvény rejti el az alkalmazás üzenetkezelő függvényét // paraméterként egy olyan függvény pointerét várja, amely a kirajzolást végzi // (muszáj megadnunk, mert akkor végezzük a rajzolást, amikor az alkalmazásunk // semmilyen más üzenetet [billentyű, egér, stb.] nem kell feldolgozzon) int d3d::entermsgloop( bool (*ptr_display)(float timedelta) ) MSG msg; ::ZeroMemory(&msg, sizeof(msg)); static float lasttime = (float)timegettime(); while(msg.message!= WM_QUIT) if(::peekmessage(&msg, 0, 0, 0, PM_REMOVE)) ::TranslateMessage(&msg); ::DispatchMessage(&msg); else float currtime = (float)timegettime(); float timedelta = (currtime - lasttime)*0.001f; return msg.wparam; ptr_display(timedelta); lasttime = currtime;

d3dinit.cpp egy keretrendszer: Setup/Cleanup/Display #include "d3dutility.h" // globális változók IDirect3DDevice9* Device = 0; // keretrendszer függvények: Setup, Cleanup, Display bool Setup() // nincs mit beállítsunk/inicializáljunk ebben a példában return true; void Cleanup() // nincs mit felszabadítsunk ebben a példában // a rajzoló/renderelő függvényünk bool Display(float timedelta) if( Device ) // csak akkor használjuk a Device eszköz metódusait, ha egy érvényes/létező eszköz // arra utasítjuk az eszközt, hogy a háttér-buffer minden pixelét fekete színűre // [D3DCLEAR_TARGET: 0x00000000 (fekete)], // míg a mélység buffer minden elemét 1.0-re állítsa // [D3DCLEAR_ZBUFFER: 1.0f] Device->Clear(0, 0, D3DCLEAR_TARGET D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0); // megcseréljük a háttér- és előtér-buffereket Device->Present(0, 0, 0, 0); return true;

d3dinit.cpp (folytatás) // WndProc LRESULT CALLBACK d3d::wndproc(hwnd hwnd, UINT msg, WPARAM wparam, LPARAM lparam) switch( msg ) case WM_DESTROY: ::PostQuitMessage(0); break; case WM_KEYDOWN: if( wparam == VK_ESCAPE ) //ESCAPE-re kilépünk ::DestroyWindow(hwnd); break; return ::DefWindowProc(hwnd, msg, wparam, lparam); // WinMain int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE previnstance, PSTR cmdline, int showcmd) if(!d3d::initd3d(hinstance,640, 480, true, D3DDEVTYPE_HAL, &Device)) ::MessageBox(0, "InitD3D() - FAILED", 0, 0); return 0; if(!setup()) ::MessageBox(0, "Setup() - FAILED", 0, 0); return 0; d3d::entermsgloop( Display ); Cleanup(); Device->Release(); return 0; exe

Alkalmazás Drótvázas kocka

cube.cpp a keretrendszer függvényeinek módosulása //globális változók IDirect3DDevice9* Device = 0; IDirect3DVertexBuffer9* VB = 0; // vertex buffer IDirect3DIndexBuffer9* IB = 0; // index buffer struct Vertex Vertex() Vertex(float x, float y, float z) _x = x; _y = y; _z = z; float _x, _y, _z; static const DWORD FVF; ; const DWORD Vertex::FVF = D3DFVF_XYZ; bool Setup() // vertex és index bufferek létrehozása Device->CreateVertexBuffer( 8 * sizeof(vertex), D3DUSAGE_WRITEONLY, Vertex::FVF, D3DPOOL_MANAGED, &VB, 0); Device->CreateIndexBuffer( 36 * sizeof(word), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &IB, 0);

cube.cpp (folytatás) // a bufferek feltöltése // egyedi vertexek: a kocka 8 csúcsa Vertex* vertices; VB->Lock(0, 0, (void**)&vertices, 0); vertices[0] = Vertex(-1.0f, -1.0f, -1.0f); vertices[1] = Vertex(-1.0f, 1.0f, -1.0f); vertices[2] = Vertex( 1.0f, 1.0f, -1.0f); vertices[3] = Vertex( 1.0f, -1.0f, -1.0f); vertices[4] = Vertex(-1.0f, -1.0f, 1.0f); vertices[5] = Vertex(-1.0f, 1.0f, 1.0f); vertices[6] = Vertex( 1.0f, 1.0f, 1.0f); vertices[7] = Vertex( 1.0f, -1.0f, 1.0f); VB->Unlock(); // a kocka oldallapjait alkotó háromszögek meghatározása WORD* indices = 0; IB->Lock(0, 0, (void**)&indices, 0); // elől indices[0] = 0; indices[1] = 1; indices[2] = 2; indices[3] = 0; indices[4] = 2; indices[5] = 3; // hátul indices[6] = 4; indices[7] = 6; indices[8] = 5; indices[9] = 4; indices[10] = 7; indices[11] = 6; // bal indices[12] = 4; indices[13] = 5; indices[14] = 1; indices[15] = 4; indices[16] = 1; indices[17] = 0; // jobb indices[18] = 3; indices[19] = 2; indices[20] = 6; indices[21] = 3; indices[22] = 6; indices[23] = 7;

cube.cpp (folytatás) // felül indices[24] = 1; indices[25] = 5; indices[26] = 6; indices[27] = 1; indices[28] = 6; indices[29] = 2; // alul indices[30] = 4; indices[31] = 0; indices[32] = 3; indices[33] = 4; indices[34] = 3; indices[35] = 7; IB->Unlock(); // elhelyezünk egy kamerát a világban D3DXVECTOR3 position(0.0f, 0.0f, -5.0f); D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); //a nézeti mátrix beállítása D3DXMATRIX V; D3DXMatrixLookAtLH(&V, &position, &target, &up); Device->SetTransform(D3DTS_VIEW, &V); // a vetítési mátrix beállítása D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, // 90 - degree (float)width / (float)height, 1.0f, 1000.0f); Device->SetTransform(D3DTS_PROJECTION, &proj); // megjelenítési mód: drótváz Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); return true; void Cleanup() d3d::release<idirect3dvertexbuffer9*>(vb); d3d::release<idirect3dindexbuffer9*>(ib);

cube.cpp (folytatás) bool Display(float timedelta) if( Device ) // forgatjuk a kockát az Ox, Oy tengelyek körül D3DXMATRIX Rx, Ry; // 45 fokkal az Ox körül D3DXMatrixRotationX(&Rx, D3DX_PI / 4.0f); // minden képkeretnél az Oy tengely körüli forgatási szög nagyságát növeljük static float y = 0.0f; D3DXMatrixRotationY(&Ry, y); y += timedelta; // ha túl léptük 2*pi-t, akkor nullázzuk a szöget if( y >= 6.28f ) y = 0.0f; // ötvözzük az Ox és Oy tengelyek körüli forgatási transzformációkat D3DXMATRIX p = Rx * Ry; Device->SetTransform(D3DTS_WORLD, &p); // megrajzoljuk a színteret Device->Clear(0, 0, D3DCLEAR_TARGET D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); Device->SetStreamSource(0, VB, 0, sizeof(vertex)); Device->SetIndices(IB); Device->SetFVF(Vertex::FVF); // kocka kirajzolása Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); Device->EndScene(); Device->Present(0, 0, 0, 0); return true; exe