Grafikus Rendszerek Zsitnyánszki Zoltán
Vectorok hossza A (x,y) 2 dimenziós: ||v|| = √(x2+y2) v 3 dimenziós: ||v|| =√(x2+y2+z2)
Inverz vektor v -v
Vekorok összegzése u v v u+v u
Vektorok kívonása -u v v u v+(-u)
Vektorok szorzása v v v v 3v
skalár szorzat Skalárszorzat esetén két vektort szorzunk össze, az eredmény egy szám mely a két vektor és a közbezárt szög(hajlásszög) közötti összefüggést tükrözi u * v = ||u||*||v||*cosα v α u
Kereszt szorzat A vektoriális szorzat eredménye egy újabb vektor, amely merőleges mindkét vektorra u x v = ||u||*||v||*sinα v α u
Mátrix műveletek
Kvaterniók http://hu.wikipedia.org/wiki/Kvaterni%C3%B3k A matematikában a kvaterniók a komplex számok négy dimenzióra történő nem kommutatív kiterjesztései
Koordiáta rendszerek y y z x x z Bal kezes koordináta rendszer Pl. XNA, OpenGl Jobb kezes koodináta rendszer Pl.DirectX Kétdimenziós helyvektor: P2d=( x , y ) Homogén koordináta: P2d=( x*w , y*w , w ) Háromdimenziós homogén koordináta: P3d=( x*w , y*w , z*w , w )
Háromdimenziós képszintézis
FrameBuffer Két Framebuffer van Front és Back( 2dimenziós tömb amelynek 1 elemének nagysága attól függ milyen színmélységet használunk) A Frontbufferbe azon adatok láthatóak a képernyőn Backbufferbe rajzolunk Ha végeztünk a rajzolással a két Framebuffert megcseréljük így amit rajzoltunk a képernyőre kerül ha ez a csere több mint 24-szer történik az emberi szem mozgóképnek érzékeli A Framebuffer 1ms alatti cseréjének számosságát az fps (frame per second) reprezentálja
Graphics pipeline Vertex stream Vertex shader Vágás, Interpolálás, Transzformáció Pixel shader Monitor Index stream A Vertexbufferbe belekerülnek a vertexek és az indexbufferbe az indexek. Az összes vertexre alkalmazzák a vertex shadert majd következik a virtuális tér 2 dimenzióra történő leképzése a Backbufferbe. A leképzés után minden pixelre végrehajtódik a pixel shader. A Backbuffer és a Frontbuffer megcserélődik ezáltal az elkészített kép a képernyőre kerül.
Rajzolás számítógéppel Minden test (ház, ember…stb) a virtuális térben poligonokkal(háromszögek) tudunk ábrázolni (drótváz model). A rajzolást 3 különböző szakaszra tudjuk bontani inicializálás, frissítés, rajzolás. Inicializálás: a kezdő vertex pontok és indexek meghatározása, a shadereks fények beállítása (kezdő állapot betöltése) Frissítés: valamilyen állapotváltozás (bill leütés,idő…stb) hatására a vertex és index adatok újra beállítása Rajzolás: a rajzoláshoz szükséges állapotok beállítása és a grafikus hardver történő rajzolás
Rajzolás XNA-val A rajzoláshoz az XNA lefoglalja magának a videókártyát és a memóriájába bemásolja a vertexeket és indexeket. Majd a amikor meghívjuk a Draw() függvényt az indexbuffer első elemére ugrik, az ott lévő számot beszorozza a vertexdeclaration-ba megadott elemek méretével és a vertexbufferbe arra a pontra ugrik,majd egy kiveszi a megfelelő byte mennyiséget. A buffert ezután megpróbálja felosztani vertexdeclaration-ba megadott elemekre. Ezután kirajzolja a vertex-et. PrimitivType-nak megfelelően tovább lép az idex bufferbe és összeköti a megfelelő pontokat.
XNA rajzoló függvényei I. Szükséges feltétel a VertexBuffer és IndexBuffer használata vertexbuffer beállítása:GraphicsDevice.Vertices[i]. SetSource() indexbuffer beállítása: Indices.SetData<T>() GraphicsDevice.DrawPrimitives(PrimitiveType primitiveType, int startVertex, int primitiveCount); primitiveType: a primitív típusa; startVertex: A vertex kezdete a vertexbufferbe primitiveCount: primitive-.ek száma GraphicsDevice.DrawIndexedPrimitives(PrimitiveType primitiveType, int baseVertex, int minVertexIndex, int numVertices, int startIndex, int primitiveCount); baseVertex: azt mutatja meg melyik indexű elemtől kezdjük a számolást a vertexbufferbe minVertexIndex = startVertex numVertices :hány vertexel dolgozunk /kezdő vertex száma = baseVertex+minVertexIndex / startIndex :Az indexek kezde az indexbufferbe
XNA rajzoló függvényei II. GraphicsDevice.DrawPrimitives<T>(PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int primitiveCount); T: vertexek típusa vertexData : vertexek vertexOffset = startVertex GraphicsDevice.DrawUserIndexedPrimitives<T> (PrimitiveType primitiveType, T[] vertexData, int vertexOffset, int numVertices,int[] indexData, int indexOffset, int primitiveCount); indexData : az indexek indexOffset: a kezdő index helye az indexbufferbe
RenderState Fog(köd): a tárgyakat amiket már nem kívánunk megjeleníteni a távolságuk miatt nem egyszerűen „kivágjuk” a jelenetből hanem egy színnel(köd) a távolságával arányosan lekeverjük így nem olyan látványosan tűnik el. CullMode(hátsó lap eldobás): minden 3szögre kiszámoljuk a normál vektorát és ami a kamera irányába mutat azt eldobjuk. FillMod(kitöltés): választhatunk hogy miként jelenítjük meg a jelenetet csak a vertexeket jelenítjük meg(POINT), vertexeket és az összekötő vonalakat(WIREFRAME), vertexek és az összekötő vonalak átal határolt területet textúrázva vagy színezve(SOLID). A wireframe megjelenítést debuggolásra szokták használni,alapesetbe Solid megjelenítést alkalmazunk. AlphaBlend (alpha csatornás átlátszóság):alpha csatorna szerinti átlátszóságot engedélyezhetjük illetve állíthatjuk be vele.
A Windows működése A windowsba az ablakokat egy azonosító úgynevezett HANDLE alapján tudjuk azonosítani Az inputot(egér,bill.) úgy dolgozza fel hogy generál egy eseményt és az aktuális ablaknak a WNDPROC függvényét meghívja ezzel az eseménnyel. Ha nem tudja feldolgozni az eseményt akkor tovább adja az ősablakának. Ezt úgy nevezzük hogy felelősség lánc. Ha az ősablaka maga a windows vagy ha az ablak feldolgozza az üzenetet akkor megáll a lánc. Ha az ablak feldolgoz egy üzenetet akkor lehetősége van újból elindítani a láncot azaz az ősének továbbadni az eseményt.
Hasznos linkek http://rbwhitaker.wikidot.com/xna-tutorials http://www.riemers.net/eng/Tutorials/xnacsharp.php http://creators.xna.com/en-US/
1. beadandó: valamilyen windows control megírása+ event 2. beadandó: valamilyen UI megírása eseménnyel 3. beadandó: személyre szabott feladat