Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Grafikus Rendszerek Zsitnyánszki Zoltán
2
Vectorok hossza A (x,y) 2 dimenziós: ||v|| = √(x2+y2) v 3 dimenziós:
||v|| =√(x2+y2+z2)
3
Inverz vektor v -v
4
Vekorok összegzése u v v u+v u
5
Vektorok kívonása -u v v u v+(-u)
6
Vektorok szorzása v v v v 3v
7
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
8
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
9
Mátrix műveletek
10
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
11
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 )
12
Háromdimenziós képszintézis
13
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
14
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.
15
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
16
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.
17
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
18
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
19
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.
20
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.
21
Hasznos linkek http://rbwhitaker.wikidot.com/xna-tutorials
22
1. beadandó: valamilyen windows control megírása+ event
2. beadandó: valamilyen UI megírása eseménnyel 3. beadandó: személyre szabott feladat
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.