Írta: Nagy Attila, Kárász Péter, Miklós Árpád, Vámossy Zoltán
VALÓS IDEJŰ
HÁROMDIMENZIÓS GRAFIKA ÉS KÉPFELDOLGOZÁS
PÁRHUZAMOS SZÁMÍTÁSTECHNIKA MODUL
PROAKTÍV INFORMATIKAI MODULFEJLESZTÉS
Lektorálta: oktatói munkaközösség
COPYRIGHT:
2011-2016, Nagy Attila, Kárász Péter, Miklós Árpád, Vámossy Zoltán, Óbudai Egyetem, Neumann János Informatikai Kar
LEKTORÁLTA: oktatói munkaközösség
Creative Commons NonCommercial-NoDerivs 3.0 (CC BY-NC-ND 3.0)
A szerző nevének feltüntetése mellett nem kereskedelmi céllal szabadon másolható, terjeszthető, megjelentethető és előadható, de nem módosítható.
TÁMOGATÁS:
Készült a TÁMOP-4.1.2-08/2/A/KMR-2009-0053 számú, “Proaktív informatikai modulfejlesztés (PRIM1): IT Szolgáltatásmenedzsment modul és Többszálas processzorok és programozásuk modul” című pályázat keretében
KÉSZÜLT: a Typotex Kiadó gondozásában FELELŐS VEZETŐ: Votisky Zsuzsa
ISBN 978-963-279-564-5
2
KULCSSZAVAK:
animáció, árnyaló, Direct3D, futószalag, GPU, grafika, háromdimenziós, képalkotás, képfeldolgozás, képszintézis, megjelenítés, modellezés, utófeldolgozás, valós idejű
ÖSSZEFOGLALÓ:
A hallgatók rövid áttekintést kapnak a számítógépes grafika történetéről, majd
megismerkednek a különböző grafikai szabványokkal (Direct3D és OpenGL), illetve a háromdimenziós képszintézis folyamatával. Továbbá ismereteket szereznek a modern háromdimenziós megjelenítést használó alkalmazások működésével kapcsolatban, és maguk is képesek lesznek ilyenek fejlesztésére (Direct3D). Megismerkednek a fix funkciós valamint a programozható futószalag működésével, lehetőségeivel és jellemzőivel.
Bevezetést kapnak a HLSL nyelven írt árnyalók (shaderek) működéséről, és megismerik azok szerkezetét és használatát. Szó esik a modern alkalmazásokban használt speciális megjelenítési technikákról is. Ezek közül néhány az órai példaprogramok keretében implementálásra kerül. Végül elsajátítják a képfeldolgozás alapszintű ismereteit, és ezeket korszerű pixel árnyalókra épített utófeldolgozó technikákon keresztül a gyakorlatban is kipróbálják.
Tartalomjegyzék
► A számítógépes grafika alapjai
► Képszintézis
► Grafikai szabványok
► Bevezetés a Direct3D használatába
► A fix funkciós futószalag
► További megjelenítési lehetőségek
► A programozható futószalag
► A programozható futószalag használata
► Komplexebb megjelenítési technikák
► Képfeldolgozás és utófeldolgozás
© Nagy Attila és társai, ÓE NIK 4 www.tankonyvtar.hu
A számítógépes grafika alapjai
Történeti áttekintés Képalkotási módok
Valós idejű megjelenítés és animáció
Tartalomjegyzék
► Történeti áttekintés
► Képalkotási módok
► Valós idejű megjelenítés és animáció
© Nagy Attila és társai, ÓE NIK 6 www.tankonyvtar.hu
Tartalomjegyzék
► Történeti áttekintés
► Képalkotási módok
► Valós idejű megjelenítés és animáció
© Nagy Attila és társai, ÓE NIK www.tankonyvtar.hu
Történeti áttekintés
8
Történeti áttekintés (1)
► Számítógépes grafika
Egészen az 1960-as évekig nyúlik vissza.
Kezdetben csak kutatóközpontokban és nagyvállalatoknál alkalmazták.
Idővel megjelent a filmiparban is.
1981: Az IBM piacra dobta az első mikroszámítógépet.
► Különálló videovezérlőt tartalmazott (MDA, CGA).
Történeti áttekintés (2)
► A videovezérlők fejlődésének főbb állomásai:
MDA: Monochrome Display and Printer Adapter (1981)
► csak karakteres megjelenítést támogatott (80x25)
► 4 kByte memória
CGA: Color Graphics Adapter (1981)
► Max. 640 x 200-as felbontás + monokróm vagy 320 x 200-as felbontás + 4 szín
► 16 kByte memória
HGC: Hercules Graphics Card (1982)
► Max. 720 x 384-es felbontás, 2 szín
► 32 kByte memória, 4 db 8 kByte-os memóriaterületből (lapok)
EGA: Enhanced Graphics Adapter (1984)
► Max. 640 x 350-es felbontás, 16 szín egyidejűleg (64 színű palettáról)
► Bővíthető memória: 64 kByte – 256 kByte
MCGA: Multi Color Graphics Array (1987)
► Hasonló felépítésű, mint az EGA
© Nagy Attila és társai, ÓE NIK 10 www.tankonyvtar.hu
Történeti áttekintés (3)
VGA: Video Graphics Array (1987)
► A mai napig szabványnak tekinthető!
► Az összes előd szöveges és grafikus módjait támogatja.
► Max. 640 x 480, 800 x 600, 16 szín
► 320 x 200, 256 szín (262 144 színű palettáról)
► Több lap támogatása (dupla pufferelés, osztott
képernyő stb.)
Történeti áttekintés (4)
► SVGA: Super Video Graphics Array (1987)
800 x 600 (16 szín) illetve 1024 x 768 (256 szín)
A VGA után egyre több grafikus op. rendszer, alkalmazás és játék jelent meg.
Igény mutatkozott nagyobb felbontású, színmélységű módokra.
Számos gyártó kezdett SVGA-kártyákat
gyártani, de ezek nem voltak szabványosak.
© Nagy Attila és társai, ÓE NIK 12 www.tankonyvtar.hu
Történeti áttekintés (5)
► VESA: Video Electronics Standard Association (1989)
Szabványosította a videokártyák programozási felületét.
Időleges megoldást biztosított, a 3D-gyorsítók
terjedésével újabb problémák jelentkeztek.
Történeti áttekintés (6)
► További modern videovezérlő szabványok:
XGA: Extended Graphics Array (1990)
► 800 x 600, 65 536 szín (16 bit)
► 1024 x 768, 256 szín (8 bit)
WXGA (1280 × 768)
XGA+ (1152 × 864)
WXGA+ (1440 × 900)
SXGA (1280 x 1024)
SXGA+ (1400 × 1050)
WSXGA+ (1680 × 1050)
UXGA (1600 × 1200)
WUXGA (1920 × 1200)
© Nagy Attila és társai, ÓE NIK 14 www.tankonyvtar.hu
A 3D grafika története (1)
► ‘70-es évek: Megjelentek az első CGI*-t felhasználó filmek (Futureworld, 1976).
► ‘80-as évek: Megszülettek az első 3D grafikát felvonultató játékok.
3D Monster Maze (1981)
Sinclair ZX81
*CGI = Computer Generated Imagery
Tron (1982)
A 3D grafika története (2)
► 1995-ben megjelentek az első 3D-gyorsítók (nVidia NV1, S3 Virge).
► Rengeteg gyártó kezdett versenyezni:
3Dfx, ATI, Intel, nVidia, Matrox, Rendition, S3 stb.
► Folyamatos és rendkívül gyors fejlődés ment végbe.
► Mára 2 óriás cég maradt: ATI, nVidia
© Nagy Attila és társai, ÓE NIK 16 www.tankonyvtar.hu
A 3D grafika története (3)
► A verseny következménye:
A GPU* képességeinek javulása
► Háromszög/s arány javul
► Memória mérete nő
► Memória sávszélessége nő
► Memória órajele nő
► A teljesítmény-felvétel nő
Új megjelenítési technikák elterjedése
Fokozatosan egyre több művelet tevődik a grafikus hardverre.
*GPU = Graphics Processing Unit
A 3D grafika története (4)
► 1995–2001
A 3D-gyorsítókba előre beprogramozták, milyen megjelenítési technikákat képesek támogatni
(pl.: textúrázás, megvilágítás, átlátszóság stb.).
Folyamatosan nőtt az igény az újabb és újabb megjelenítési technikákra.
Ezt a megvalósítást fix funkciós futószalagnak nevezik (fixed function pipeline vagy röviden FFP).
© Nagy Attila és társai, ÓE NIK 18 www.tankonyvtar.hu
A 3D grafika története (5)
► 2001 óta
Lehetőség nyílik saját megjelenítési technikák megvalósítására.
Közvetlenül a videokártyán futó programokat (ún. shadereket) lehet készíteni.
A shaderekkel helyettesíthetők a korábban fixen beépített funkciók.
Ezt a megvalósítást programozható futószalagnak nevezik
(programmable pipeline vagy röviden PP).
A 3D grafika története (6)
► A jelen
A gyors fejlődés következtében a GPU-k
számítási kapacitása meghaladta a CPU-két.
GPGPU: General-purpose computing on GPU
► Általános célú műveletek végzése GPU-n
► Nagy számításigényű műveletek végrehajtása
► Pl.: adatbázis műveleteket, képfeldolgozást, fizikai szimulációt és mesterséges intelligenciához
kapcsolódó számításokat is végeznek a GPU segítségével.
© Nagy Attila és társai, ÓE NIK 20 www.tankonyvtar.hu
Tartalomjegyzék
► Történeti áttekintés
► Képalkotási módok
► Valós idejű megjelenítés és animáció
© Nagy Attila és társai, ÓE NIK www.tankonyvtar.hu
Képalkotási módok
22
Képalkotási módok
► Képalkotási (render) mód:
Az az eljárás, ahogy a virtuális 3D világról pillanatképet alkotunk és a monitoron
megjelenítjük azt.
A virtuális világ 3D térben adott, a monitor 2D képek megjelenítésére alkalmas (leképzés).
► Főbb képalkotási módok:
Sugárkövetés (ray tracing)
Globális illumináció
Inkrementális képszintézis
Sugárkövetés (1)
► Elve
A fotonok útvonalát követi végig a kamerától minden pixelből kiindulva.
A fotonok követését fizikai szabályok alapján végzi (fénytörés, visszaverődés).
► Előnye
Jól illeszkedik a valósághoz.
Önmagában megoldja a takarás, az árnyalás,
árnyékolás, átlátszóság, fénytörés stb. problémáit.
► Hátránya
Nagy számításigény, nem valós idejű megjelenítés.
© Nagy Attila és társai, ÓE NIK 24 www.tankonyvtar.hu
Sugárkövetés (2)
A sugárkövetés nagyon valósághű képeket képes produkálni (nincs szükség „trükközésre”).
Forrás: [3]
Globális illumináció (1)
► A sugárkövetés hiányosságai
Nem foglalkozik a fotonok többszörös visszaverődésével.
A fényforrásokat osztályokba sorolja (pontszerű,
irányított, reflektor), amik a valóságban nem léteznek.
A színek nemcsak az R, G, B, hanem a teljes látható színtartomány hullámhosszain terjedhetnek.
► Bizonyos alkalmazásokban szükséges pontosabb képalkotási technika
Világítástervezés
Egyéb mérnöki alkalmazások
© Nagy Attila és társai, ÓE NIK 26 www.tankonyvtar.hu
Globális illumináció (2)
Nincs globális illumináció Van globális illumináció
Forrás: [4]
Inkrementális képszintézis (1)
► Elve
Újrahasználja a szomszédos pixelekre kiszámított attribútumokat (szín, mélység).
Nem minden pixelre külön végződnek a számítások, szemben a sugárkövetéssel.
A világban megjelenő objektumokat csúcspontokkal és sokszögekkel írja le.
Megjelenítéskor a 3D csúcspontok vetítődnek a 2D képernyőre.
A vetített 2D csúcspontok közti pixelek attribútumai interpolációval határozódnak meg!
© Nagy Attila és társai, ÓE NIK 28 www.tankonyvtar.hu
Inkrementális képszintézis (2)
► Előnye
Valós idejű megjelenítés érhető el vele!
A korszerű GPU-k ezt a technikát használják.
Hardveresen gyorsított!
► Hátránya
A számítások egyszerűsítése miatt az előálló kép nem realisztikus!
Speciális megjelenítési technikák szükségesek a generált kép minőségének javítására!
Nekünk kell gondoskodni az árnyalásról, árnyékokról, az
átlátszóságról stb.
Inkrementális képszintézis (3)
► Speciális megjelenítési technikák
Takarásvizsgálat (Z-buffering)
Megvilágítás (Ambient/diffuse/specular lighting)
Textúrázás (Texture mapping)
Ködmegjelenítés (Volumetric fog)
Árnyékmegjelenítés (Shadow volume/mapping)
Átlátszóság/színkeverés (Alpha Blending)
Tükröződés (Reflection mapping)
Mélységérzékeltetés (Depth-of-field)
Pixelenkénti megvilágítás (Bump/Normal mapping)
Stb.
© Nagy Attila és társai, ÓE NIK 30 www.tankonyvtar.hu
Inkrementális képszintézis (4)
Flat shading Gouraud shading Phong shading
Inkrementális képszintézis (5)
A mai 3D játékok is inkrementális képszintézissel képesek látványos megjelenítésre (speciális megjelenítési technikák).
© Nagy Attila és társai, ÓE NIK 32 www.tankonyvtar.hu
Tartalomjegyzék
► Történeti áttekintés
► Képalkotási módok
► Valós idejű megjelenítés és animáció
© Nagy Attila és társai, ÓE NIK www.tankonyvtar.hu
Valós idejű megjelenítés és animáció
34
Valós idejű megjelenítés (1)
► Animáció: Apró eltéréseket ábrázoló
állóképek sorozata megfelelő sebességgel váltogatva.
► Képkocka (frame): Egy kép az animáció során megjelenített állókép sorozatból.
► Az emberi szem kb. 25–30 képet képes
érzékelni másodpercenként.
Valós idejű megjelenítés (2)
► A másodpercenként rajzolt képkockák
mérőszáma az FPS (Frames Per Second).
► A valós idejű megjelenítés
Másodpercenként legalább 25 képkocka (25 FPS)
Követelmény: 1000 ms alatt legalább 25
képkocka, azaz 1000 ms /25 = 40 ms/ képkocka
© Nagy Attila és társai, ÓE NIK 36 www.tankonyvtar.hu
Valós idejű megjelenítés (3)
► Valós idejű megjelenítésről beszélünk, ha a 3D világ egy képkockáját legfeljebb 40 ms alatt ki tudjuk rajzolni!
► Másként: ha az animáció sebessége
legalább 25 FPS!
Összegzés
Valós idejű háromdimenziós grafika
A kép előállítása max. ~40 ms (25 FPS)
© Nagy Attila és társai, ÓE NIK 38 www.tankonyvtar.hu
Irodalomjegyzék
[1] Szirmay-Kalos L., Antal Gy., Csonka F.: Háromdimenziós grafika, animáció és játékfejlesztés, Computerbooks, 2003
[2] Nyisztor K.: Grafika és játékprogramozás DirectX-szel, SZAK Kiadó, 2005
[3] Wikipedia, Raytracing, http://en.wikipedia.org/wiki/Ray_tracing_(graphics)
[4] Wikipedia, Global illumination, http://en.wikipedia.org/wiki/Global_illumination
Képszintézis
Alapelvek
A képszintézis lépései
© Nagy Attila és társai, ÓE NIK 40 www.tankonyvtar.hu
Tartalomjegyzék
► Alapelvek
► A képszintézis lépései
Tartalomjegyzék
► Alapelvek
► A képszintézis lépései
© Nagy Attila és társai, ÓE NIK 42 www.tankonyvtar.hu
Alapelvek
Az inkrementális képszintézis elvei (1)
1. Pixelek helyett az objektumtér nagyobb elemeivel dolgozik (pl. poligonok).
2. Ahol lehet alkalmazza az ún. inkrementális elvet.
A pixelek mélységi és szín információit a
megelőző pixeléből kiindulva határozza meg.
Kevesebb számítás
© Nagy Attila és társai, ÓE NIK 44 www.tankonyvtar.hu
Az inkrementális képszintézis elvei (2)
3. Minden feladatot abban a koordináta- rendszerben végez el, amiben a
legegyszerűbben megtehető.
Ennek érdekében az objektumok felületeit sokszögekkel közelíti (tesszelláció).
A koordináta-rendszerek közt lineáris geometriai transzformációval vált.
4. Feleslegesen nem számol
A képernyőn biztosan nem látható geometriai
elemeket, illetve azok részeit eltávolítja (vágás).
► Jellemzői
Az egyszerűsítő elveknek köszönhetően valós idejű megjelenítést biztosít, de romlik a
képminőség.
A csökkenő képminőség ellensúlyozásához
speciális megjelenítési technikákra lesz szükség!
► Következmény
A valós idejű 3D grafikus alkalmazások inkrementális képszintézist használnak.
© Nagy Attila és társai, ÓE NIK 46 www.tankonyvtar.hu
Tartalomjegyzék
► Alapelvek
► A képszintézis lépései
A képszintézis lépései
© Nagy Attila és társai, ÓE NIK 48 www.tankonyvtar.hu
A képszintézis lépései (1)
1. Modellezés
A megjelenítendő alakzatok elkészítése valamilyen modellezési módszerrel.
2. Tesszelláció
A modellezett alakzat felületéből közelítő poligonháló ( mesh ) előállítása.
3. Modellezési transzformáció
A poligonhálók elhelyezése a virtuális térben.
4. Nézeti transzformáció
A virtuális kamera elhelyezkedéséből adódó
transzformációk elvégzése.
Az inkrementális képszintézis lépései (2)
5. Perspektív transzformáció
A 3D csúcspont ( vertex ) koordináták vetítése a képernyő koordináta-rendszerébe.
6. Vágás
A képernyőn nem látszódó részletek eldobása.
7. Takarási feladat
Triviális hátsólap eldobás
Mélységi puffer algoritmus 8. Árnyalás
A képernyőn megjelenő pixel színek meghatározása anyag és megvilágítás függvényében.
© Nagy Attila és társai, ÓE NIK 50 www.tankonyvtar.hu
Modellezés
► Erről az elméleti órán esik szó…
Tesszelláció
► Az elkészített modell felületének közelítése sokszögekkel.
► A sokszögek csúcspontjai ( vertex ) tárolják az objektumfelület adott pontjának adatait:
3D koordináta
Normálvektor
Anyagjellemzők (szín, textúra koordináták stb.)
Stb.
© Nagy Attila és társai, ÓE NIK 52 www.tankonyvtar.hu
Transzformációk
Nézeti mátrix
Vetítési mátrix objektum
Objektumkoordináta-rendszer (object space)
Világkoordináta-rendszer (world space)
Kamerakoordináta-rendszer (view space)
Képernyő Világ mátrix
Képernyőkoordináta-rendszer (screen space)
A kamera nézőpontjából tekintett koordináta-rendszer. Minden objektumot a kamerához képest relatív koordináta-rendszerbe helyez el.
Az összes objektumot azonos koordináta-rendszerbe, az ún. világ- koordináta-rendszerbe, vagy röviden a világtérbe helyezi.
Az egyes objektumok saját koordináta-rendszere, amiben az objektumot modellezték. Minden objektum esetén eltérhet.
Az objektumok a képernyő koordináta-rendszerébe kerülnek. A vetítési mátrixszal való transzformáció befolyásolja, hogy az objektumok csúcspontjai milyen pixel koordinátákra kerüljenek.
Vágás (clipping)
► Cél
Azon poligonok eldobása, melyek a nézeti csonka gúlán ( view frustum ) kívülre esnek.
Az első vágósík előtti és a hátsó vágósík utáni poligonok eldobása.
Vágás előtti állapot Vágás utáni állapot
Forrás: [3]
© Nagy Attila és társai, ÓE NIK 54 www.tankonyvtar.hu
Takarási feladat (1)
► Triviális hátsólap eldobás ( backface culling )
Azon poligonok eldobása, melyek a kamerának háttal láthatók.
Poligonokkal dolgozik
Takarási feladat (2)
x y
z
n
1n
2nézeti csonka gúla
© Nagy Attila és társai, ÓE NIK 56 www.tankonyvtar.hu
Takarási feladat (3)
► Mélységi pufferelés
( Z-buffering , W-buffering )
Azon vetített pixelek eldobása, melyet egy
„előtte lévő” kitakar.
Pixelekkel dolgozik
Később részletesebben!
Takarási feladat (4)
6553
5 6553
5 6553
5 6553
5 4 ...
1 1 7 8 6553
5 ...
6 7 8 8 1 ...
7 7 1 1 2 ...
6553
5 6553
5 6553
5 6553
5 6553
5 ...
... ... ... ... ... ...
Z-puffer
képernyőtér
© Nagy Attila és társai, ÓE NIK 58 www.tankonyvtar.hu
Árnyalás (1)
► Cél: Az objektum árnyalásának (színének) meghatározása árnyalási egyenlettel.
► Az árnyalás eredményét az alábbiak befolyásolják:
Az objektum csúcspontjainak attribútumai
(pl.: szín, normál vektorok, textúra koordináták)
Az objektum anyaga (színe)
(pl.: szórt, diffúz, spekuláris színösszetevők)
Az objektum mintája (textúrái)
A jelenetet megvilágító fényforrások paraméterei
Speciális technikák alkalmazásakor további tényezők
Árnyalás (2)
► Az árnyalás alapesetben a csúcspontokra számítódik (per-vertex lighting).
► A köztes pixelekre interpolációval generálódik az árnyalás.
Flat shading Gouraud shading Phong shading
per-vertex
(bilineáris interpoláció)
per-pixel per-vertex
(legközelebbi szomszédok)
© Nagy Attila és társai, ÓE NIK 60 www.tankonyvtar.hu
Árnyalás (3)
► Árnyalás saját színnel
Kitöltés az előre megadott színnel.
Gyors, de teljesen valószerűtlen, mert nem veszi
figyelembe a megvilágítást.
Árnyalás (4)
► Árnyalás konstans színnel ( flat shading )
Kitöltés a csúcspontokra kiszámított fényintenzitás alapján.
► OpenGL: átlagolás; DirectX: véletlen kiválasztás
Gyors, de még mindig valószerűtlen (sík hatást kelt).
© Nagy Attila és társai, ÓE NIK 62 www.tankonyvtar.hu
Árnyalás (5)
► Gouraud-árnyalás (per-vertex lighting)
Kitöltés a csúcspontokra kiszámított fényintenzitás alapján.
A találkozó lapok normálvektoraiból interpolált vektorok tárolása a csúcsok adatai között.
A színadatok lineáris interpolációján alapul.
Interpoláció a csúcspontok között élek pontjainak meghatározása
Kitöltés az élek pontjai között minden pont kiszínezése
Közepesen gyors, az éleket jól simítja, de csak diffúz felületeket jelenít meg valószerűen.
A spekuláris visszaverődések eltűnhetnek.
Nemlineáris színváltozások kezelésére alkalmatlan.
Árnyalás (6)
x
1, y
1RGB
1x
2, y
2RGB
2RGB
a= (RGB
1(y
s-y
2)+RGB
2(y
1-y
s))/(y
1-y
2) RGB
b= (RGB
1(y
s-y
3)+RGB
3(y
1-y
s))/(y
1-y
3) RGB
s= (RGB
a(x
b-x
s)+RGB
b(x
s-x
a))/(x
b-x
a)
x
3, y
3RGB
3x
a, y
sx
b, y
sx
s, y
sΔRGB
y= (RGB
1-RGB
2)/(y
1-y
2) ΔRGB
s= (RGB
b-RGB
a)/(x
b-x
a)
© Nagy Attila és társai, ÓE NIK 64 www.tankonyvtar.hu
Árnyalás (7)
► Phong-árnyalás (per-pixel lighting)
Kitöltés az összes képpontra külön-külön megoldott árnyalási egyenlet eredményeinek megfelelően.
Spekuláris összetevő számítása a visszaverődési és a nézeti vektor által bezárt szög alapján.
A csúcsokban tárolt árnyalási normálvektorok lineáris interpolációján alapul.
A színtérben nemlineáris interpoláció pontosabb leképezés
Rendkívül lassú, de mind a diffúz, mind a spekuláris fényhatásokat valószerűen jeleníti meg.
Nincs fix hardveres megvalósítása.
Modern 3D hardverrel megvalósítható („pixel shader”).
Önkényes a spekuláris összetevőnél alkalmazott függvény.
Árnyalás (8)
► Phong-árnyalás
x
2, y
2, z
2x
3, y
3z
3x
1, y
1, z
1x
s, y
s, z
sn
2n
1n
3© Nagy Attila és társai, ÓE NIK 66 www.tankonyvtar.hu
Árnyalás (9)
► Phong–Blinn-árnyalás
Alapjaiban megegyezik a Phong-árnyalással.
Az árnyalási normálvektorok interpolációján és az árnyalási egyenlet képpontonkénti megoldásán alapul.
Módosítások:
► Spekuláris összetevő számítása a megvilágítási és a nézeti vektor felezővektora alapján.
► Gyorsabban kiszámítható a spekuláris összetevő.
► Bizonyos anyagparaméterekkel módosított árnyalási egyenlet.
► Normálvektorok nemlineáris interpolációján alapul.
Árnyalás (10)
► Példa: Gouraud- és Phong-árnyalás
© Nagy Attila és társai, ÓE NIK 68 www.tankonyvtar.hu
Árnyalás (11)
► Példa: Phong- és Phong–Blinn-árnyalás
► A valóságosabb árnyalás érdekében további speciális technikák szükségesek
Textúrázás
Átlátszóság
Árnyékvetítés
Komplexebb megvilágítás (pl. normal mapping)
Élsimítás
Tükröződés
Köd szimuláció
Stb.
Később részletesebben!
© Nagy Attila és társai, ÓE NIK 70 www.tankonyvtar.hu
Irodalomjegyzék
[1] Szirmay-Kalos L., Antal Gy., Csonka F.: Háromdimenziós grafika, animáció és játékfejlesztés, Computerbooks, 2003
[2] Nyisztor K.: Grafika és játékprogramozás DirectX-szel, SZAK Kiadó, 2005 [3] Eckel G., Kempf R., and Wennerberg L., OpenGL Optimizer™ Programmer's
Guide: An Open API for Large-Model Visualization, Silicon Graphics inc,
1998
Grafikai szabványok
Bevezetés
Ismerkedés a Direct3D API-val Direct3D-alkalmazások szerkezete
.NET wrapperek
© Nagy Attila és társai, ÓE NIK 72 www.tankonyvtar.hu
Tartalomjegyzék
► Bevezetés
► Ismerkedés a Direct3D API-val
► Direct3D-alkalmazások szerkezete
► .NET wrapperek
Tartalomjegyzék
► Bevezetés
► Ismerkedés a Direct3D API-val
► Direct3D-alkalmazások szerkezete
► .NET wrapperek
© Nagy Attila és társai, ÓE NIK 74 www.tankonyvtar.hu
Bevezetés
Grafikai szabványok
► Céljuk
A hardversajátosságok elrejtése (eszközfüggettlenség).
Szabványos programozói felület (API) biztosítása.
► A hardvergyártók és a szabványt biztosító szervezetek közötti együttműködés teszi ezt lehetővé.
► A grafikus API-k implementációi a videokártya driverben találhatók.
► A legelterjedtebb grafikai szabványok
Direct3D
OpenGL
► Mindkét API hasonló funkcionalitással bír, eltérő architektúra mellett.
© Nagy Attila és társai, ÓE NIK 76 www.tankonyvtar.hu
OpenGL (1992–…)
► Eredetileg a Silicon Graphics által kidolgozott szabvány.
► A Khronos Group konzorcium menedzseli.
Számos hardvergyártó és szoftvercég tagja
(pl.: ATI, Discreet, Intel, nVidia, SGI, Sun stb.)
► Legfrissebb változata az OpenGL 4.1 (2010)
► Procedurális felépítésű (C)
► Bővíthető funkcionalitás (extensions)
Direct3D (1995–…)
► A DirectX programozói felület részét képzi
► A DirectX a Microsoft által kidolgozott szabvány
► Legfrissebb változata a DirectX 11 (2011.
február)
► Objektumorientált felépítésű (C++)
► Előre definiált funkcionalitás, nem bővíthető
© Nagy Attila és társai, ÓE NIK 78 www.tankonyvtar.hu
A DirectX klasszikus komponensei
► Direct3D: A 3D grafikai lehetőségek kihasználását biztosítja.
► DirectDraw*: A 2D grafikai szolgáltatásokat biztosítja.
► DirectInput*: Az adatbeviteli eszközök kezelését segíti.
► DirectSound*, DirectSound3D*, DirectMusic*: Különféle 2D/3D hanghatások és zenék lejátszását biztosítja.
► DirectPlay*: Hálózaton keresztüli kommunikációt biztosít.
► DirectShow**: Különböző médiákon elhelyezkedő tartalmak visszajátszását, rögzítését és manipulálását biztosítja (pl.: filmek, zenék, felvevő eszközök stb.).
* A DirectX újabb verzióiban modernebb API váltotta le.
** A DirectShow 2007 óta a Windows SDK-ba került át.
A DirectX 10 és 11 új komponensei
► Direct2D: A DirectDraw komponens váltotta le (2D grafika).
► DirectCompute: GPGPU-támogatás
► DirectWrite: betűtípusok támogatására
► DXGI: megjelenítő eszközök menedzselése
► Stb.
© Nagy Attila és társai, ÓE NIK 80 www.tankonyvtar.hu
A Direct3D 10 és 11 jellemzői
► A D3D 10 és 11 letisztultabb, jobban alkalmazkodik a kor igényeihez.
Többszálúság jobb kihasználása
Új, és továbbfejlesztett árnyaló technológia
GPGPU-támogatás
► De
Csak a Windows Vista és az utáni operációs rendszerek támogatják.
Nincs még olyan játékkonzol, ami támogatja → a fejlesztő cégek nem állnak át → lassan terjed
A félév során a Direct3D 9 API-val ismerkedünk meg!
Direct3D vs. OpenGL
Direct3D OpenGL
Platform Windows, XBox stb.* Platformfüggetlen Az API felépítése Objektumorientált Procedurális
Szolgáltatások
komplexitása Komplex, magasabb szintű
funkciók Egyszerű, alacsonyabb szintű műveletek
Gyártóspecifikus
bővítmények Nem elérhetők, az API
rögzített Elérhetők, ún. extension elemeken keresztül
Mobil változatok Direct3D Mobile OpenGL ES Koordináta-
rendszer Bal- illetve jobbsodrású Jobbsodrású Használhatóság Kezdetben nehezebb,
később könnyebb Kezdetben könnyebb, később nehezebb
* A Wine Windows emulátor segítségével Linuxon is képes működni.
© Nagy Attila és társai, ÓE NIK 82 www.tankonyvtar.hu
Megvalósítás
Alkalmazás
(CAD, játék, bemutató...)
3D programozói felület (API) (OpenGL, Direct3D, Glide...)
3D gyorsítóhardver meghajtóprogramja
(ATi Catalyst, nVidia ForceWare...)
3D gyorsítóhardver
(ATi Radeon, nVidia GeForce...)
Új f un kciók be vezeté se M eg jelen ítés i f ela da tok áth elyez ődés e Telj esítmén y R uga lmasság
Tartalomjegyzék
► Grafikai szabványok
► Ismerkedés a Direct3D API-val
► Direct3D-alkalmazások szerkezete
► .NET wrapperek
© Nagy Attila és társai, ÓE NIK 84 www.tankonyvtar.hu
Ismerkedés a Direct3D API-val
Szerkezeti jellemzői
1. Közvetlen módú megjelenítés (immediate mode rendering)
2. Rajzolási állapotok alkalmazása (rendering states)
3. Képkocka pufferek használata (frame buffer, back buffer)
4. Mélységi és stencil pufferek használata (depth buffer, stencil buffer)
© Nagy Attila és társai, ÓE NIK 86 www.tankonyvtar.hu
Rajzolási módszer (1)
► A grafikus API-k kétféle rajzolási módszert alkalmazhatnak
Megtartott módú rajzolás (retained-mode rendering)
Közvetlen módú rajzolás
(immediate-mode rendering)
► Gyakran a két módszert vegyesen alkalmazzák.
► A D3D közvetlen módú rajzolást alkalmaz!
Rajzolási módszer (2)
► Megtartott mód (Retained-mode rendering)
A grafikus API magas szintű objektumok (pl. síkidomok) paramétereit tárolja az egymást követő képkockák közt.
A programozónak csak a magas szintű objektumok paramétereit kell beállítani (változáskor), a többi az API dolga.
Deklaratív jellegű működés
Ilyen működésű pl. WPF
© Nagy Attila és társai, ÓE NIK 88 www.tankonyvtar.hu
Rajzolási módszerek (3)
► Közvetlen módú
(Immediate-mode rendering)
A grafikus API alacsony szintű primitívek rajzolását biztosítja, melyekről a programozónak kell gondoskodnia.
Az egymást követő képkockák közt az API nem tárol adatokat a kirajzolt objektumokról, erről a programozó gondoskodik.
Ilyen működésű pl.: GDI, D3D
Rajzolási állapotok (1)
► A rajzolás alapegységei a primitívek.
► Már egy db háromszög kirajzolásakor is rengeteg paraméter definiálható
(pl.: mátrixok, szín, átlátszóság, megvilágítás stb.).
► Több tucat rajzolási paraméter létezik.
► Körülményes és lassú lenne mindig minden paramétert megadni.
► Megoldás: a rajzolási állapotok bevetetése!
© Nagy Attila és társai, ÓE NIK 90 www.tankonyvtar.hu
Rajzolási állapotok (2)
► A rajzolási paraméterek állapotbeállító
metódusokkal adhatók meg (SetRenderState()).
► Míg nem módosítjuk a paramétert, ugyanabban az állapotban lesz (csak változáskor kell újra
megadni).
SetRenderState(COLOR, yellow);
SetRenderState(TRANSPARENCY, 50%);
SetRenderState(TEXTURE, „image.bmp");
SetRenderState(…, …);
DrawPrimitive(primitive1);
DrawPrimitive(primitive2);
…
DrawPrimitive(primitiveN);
DrawPrimitive(primitive1, yellow, 50%, "image.bmp", …);
DrawPrimitive(primitive2, yellow, 50%, "image.bmp", …);
…
DrawPrimitive(primitiveN, yellow, 50%, "image.bmp", …);
Rajzolási állapotokkal:
Frame (képkocka) puffer
► A frame puffer tartalma kerül a képernyőre.
► Ha a frame pufferbe közvetlenül kerül a
képszintézis eredménye, animáció esetén villogás tapasztalható! Oka:
A képszintézis során a képkockát elemi lépések építik fel.
Előfordulhat, hogy a képernyőre félkész állapot kerülhet.
► A képernyőre rajzolás, és a megjelenítés nem szinkronban történik.
© Nagy Attila és társai, ÓE NIK 92 www.tankonyvtar.hu
Amennyiben a megjelenítés közvetlenül a frame pufferbe történik, előfordulhat, hogy a képernyőre rajzolás még azelőtt bekövetkezik, hogy a frame
pufferben a teljes tartalom előállt volna → villogás (flickering) A képernyőn megjelenő
(félkész) képkocka A tényleges képkocka
Dupla pufferelés
► A villogásra megoldás a dupla pufferelés.
► A képernyőre rajzolás továbbra is a frame pufferből történik.
► Megjelenítés egy ún. hátsó pufferbe ( back buffer ).
► Amint a képszintézis eredménye a hátsó pufferben előállt, a frame puffer és a hátsó puffer szerepet cserélnek.
© Nagy Attila és társai, ÓE NIK 94 www.tankonyvtar.hu
Dupla pufferelés esetén előfordulhat, hogy a pufferek cseréjekor a pixeleket pásztázó mechanizmus még a képernyő közepénél jár → képszakadás
(visual tearing)
A megjelenő képkocka A tényleges képkocka
Vertikális szinkronizáció (V-Sync)
► A képszakadás kiküszöbölhető a pufferek
megfelelő időpillanatban történő cserélésekor.
A pixel pásztázó mechanizmus a képernyő bal felső sarkától a jobb alsó sarkáig megy soronként.
A puffereket akkor kell felcserélni, mikor a pásztázó a jobb alsó sarokból a bal felsőbe tér vissza (vertikális visszatérés).
Amíg a visszatérés nem következik be, a D3D blokkolja a további megjelenítést. (Az animáció sebessége a
képfrissítési frekvenciától függ ekkor!)
© Nagy Attila és társai, ÓE NIK 96 www.tankonyvtar.hu
Tripla pufferelés
► Hasonló a dupla puffereléshez, de itt a frame pufferen kívül két hátsó puffer van.
► V-Sync esetén nincs blokkolás, mivel a két hátsó puffer közt szabadon lehet váltogatni.
► Megmarad a V-Sync kedvező hatása, és elérhető a
képfrissítési frekvenciától független animáció.
Mélységi és stencil pufferek
► Mélységi puffer (z-buffer, w-buffer)
A láthatósági feladat megoldásához a D3D z-puffert vagy w-puffert képes alkalmazni.
► Stencil puffer (stencil buffer)
Segítségével az egyes pixelek engedélyezhetők és letilthatók.
Egy letiltott pixelre való rajzolás nem módosítja a pixel eredeti értékét.
Így megoldható, hogy csak bizonyos pixelekre
rajzoljunk, más pixelek tartsák meg korábbi színüket.
© Nagy Attila és társai, ÓE NIK 98 www.tankonyvtar.hu
Tartalomjegyzék
► Grafikai szabványok
► A Direct3D alapjai
► Direct3D-alkalmazások szerkezete
► .NET wrapperek
Direct3D-alkalmazások szerkezete
© Nagy Attila és társai, ÓE NIK 100 www.tankonyvtar.hu
D3D-alkalmazások főbb részei
1. A D3D inicializálása
2. A D3D eszközkapcsolat felépítése
3. Grafikus erőforrások betöltése
4. Megjelenítés, animáció, a program működése…
5. Grafikus erőforrások felszabadítása
6. A D3D eszközkapcsolat megszüntetése
7. A D3D objektum felszabadítása
Tartalomjegyzék
► Grafikai szabványok
► A Direct3D alapjai
► Direct3D-alkalmazások szerkezete
► .NET wrapperek
© Nagy Attila és társai, ÓE NIK 102 www.tankonyvtar.hu
.NET wrapperek
► A Direct3D natív C++ függvénykönyvtár
► Egy burkoló modul ( wrapper ) szükséges, hogy C#-ból elérhető legyen.
► Főbb wrapper-ek C#-hoz
Microsoft XNA Framework
Microsoft Managed DirectX
SlimDX
© Nagy Attila és társai, ÓE NIK 104 www.tankonyvtar.hu
Microsoft XNA Framework
► Hivatalos teljesen .NET alapú keretrendszer a DirectX 9 szolgáltatásainak elérésére.
► Bizonyos mértékben leegyszerűsíti a Direct3D által kínált lehetőségeket, de gyakorlatilag minden
elérhető ezen a wrapperen keresztül.
► Támogatja az Xbox 360, a Zune és a Windows Phone 7 platformokat is!
► Kimondottan játékfejlesztésre optimalizálták,
eléggé elterjedt.
Microsoft Managed DirectX
► Korábbi hivatalos .NET alapú wrapper a DirectX- hez.
► Ma már nem támogatott, kevesen használják, és az újabb DirectX API-kat nem támogatja.
► Felülete hasonló volt az eredeti natív DirectX felületéhez.
► Régóta nem fejlesztik, hivatalosan az XNA Framework váltotta le.
© Nagy Attila és társai, ÓE NIK 106 www.tankonyvtar.hu
SlimDX
► Nem hivatalos, open source wrapper a DirectX szolgáltatásaihoz.
► Támogatja a DirectX 9, 10 és 11 verzióit is.
► Struktúrája közelebb áll a natív DirectX-hez, mint az XNA keretrendszeré.
► Általános célú feladatra jobb, mint az XNA.
A félév során ezt fogjuk felhasználni!
Feladat
Direct3D inicializálása egy C#
alkalmazásban
© Nagy Attila és társai, ÓE NIK 108 www.tankonyvtar.hu
Irodalomjegyzék
[1] Szirmay-Kalos L., Antal Gy., Csonka F.: Háromdimenziós grafika, animáció és játékfejlesztés, Computerbooks, 2003
[2] Nyisztor K.: Grafika és játékprogramozás DirectX-szel, SZAK Kiadó, 2005 [3] MSDN.com, Microsoft DirectX 9.0 Documentation,
http://msdn.microsoft.com/en-us/library/ee416796(v=VS.85).aspx
Bevezetés a Direct3D használatába
Geometria definiálása Rajzolási állapotok Rajzolási utasítások
© Nagy Attila és társai, ÓE NIK 110 www.tankonyvtar.hu
Tartalomjegyzék
► Geometria definiálása
► Rajzolási állapotok
► Rajzolási utasítások
Tartalomjegyzék
► Geometria definiálása
► Rajzolási állapotok
► Rajzolási utasítások
© Nagy Attila és társai, ÓE NIK 112 www.tankonyvtar.hu
Geometria definiálása
Geometria definiálása (1)
► A megjelenítendő 3D-modell geometriáját (poligonhálóját) le kell írnunk, hogy
kirajzolhassuk.
► A poligonháló építőelemei:
a primitívek (pont, vonal, háromszög)
A primitíveket csúcspontokkal (vertex) definiáljuk.
A csúcspontok közti kapcsolatot, a poligonhálót alkotó primitívek típusa határozza meg.
© Nagy Attila és társai, ÓE NIK 114 www.tankonyvtar.hu
Geometria definiálása (2) – Primitív típusok
Pontlista (point list)
A definiált csúcspontokat különálló pontokként kezeli a D3D. Megjelenítéskor ezek alapesetben 1 pixelnyi kiterjedésűek, de ez módosítható.
Vonallista (line list)
Az egymás után definiált csúcspontokat páron- ként összeköti. Különálló vonalszegmensek definiálására használható.
Vonalszalag (line strip)
Minden csúcspontot összeköt az előzővel.
Folyamatos vonal definiálására használható.
Geometria definiálása (3) – Primitív típusok
Háromszöglista (triangle list)
Minden egymást követő csúcspont hármast különállóan összeköt, és a csúcspontok közti részt kitölti (az árnyalásnak megfelelően).
Háromszögszalag (triangle strip)
Az első három csúcspont összeköti, majd minden további csúcspontot összeköt az előző kettővel, így alkotva kitöltött háromszögeket
Háromszöglegyező (triangle fan)
Az első három csúcspont összeköti, majd minden további csúcspontot összeköt az előzővel, és a legelsővel, így alkotva kitöltött háromszögeket.
© Nagy Attila és társai, ÓE NIK 116 www.tankonyvtar.hu
Geometria definiálása (4) – Csúcspont típusok
► A primitív típusok önmagukban csak a csúcspontok közti kapcsolatokat, éleket határozzák meg.
► A konkrét adatok a csúcspontokban tárolódnak
3D pozíció
Szín
Normálvektor
Textúra koordináta
Stb.
► A csúcspont típusa meghatározza, hogy pontosan milyen adatokat ír le (ez szükséges a D3D
részére).
Geometria definiálása (5) – Csúcspont típusok
► A csúcspontok típusa a flexibilis
csúcspontformátum (FVF: flexible vertex format ) segítségével definiálható.
Az FVF bitmaszkkal írja le, hogy milyen adatok tárolódnak a csúcspontokban.
Meghatározza, hogy a csúcspont adatok hogyan ábrázolódnak.
© Nagy Attila és társai, ÓE NIK 118 www.tankonyvtar.hu
Geometria definiálása (6) – Csúcspont típusok
► Az alábbi felsorolástípussal adható meg az aktuálisan használt csúcspontok formátuma.
[Flags]
public enum VertexFormat {
Position = 2, Normal = 16, PointSize = 32, Diffuse = 64, Specular = 128, Texture1 = 256, Texture1 = 256, …
}
Device d3dDevice = …;
VertexFormat fvf = VertexFormat.Position|VertexFormat.Diffuse|VertexFormat.Normal;
d3dDevice.VertexFormat = fvf;
Példa – kocka drótváz definiálása
► Hogyan definiálható a drótváz geometriája?
• Definiálni kell a vonalszakaszok csúcspontjait.
• Érdemes vonallistát használni primitív típusként.
• A definiált csúcspontokat tömbben kell eltárolni
(a vonalszakaszok a tömb 1.-2., 3.-4., 5.-6., … csúcspontjai közé kerülnek).
(0, 1, 0)
(0, 1, 1) (1, 1, 1)
(1, 0, 1) (1, 0, 0)
(0, 0, 0)
(0, 0, 1)
y
z x
(1, 0, 0)
© Nagy Attila és társai, ÓE NIK 120 www.tankonyvtar.hu
Példa – kocka drótváz definiálása
► Definiáljuk a csúcspont adatokat tároló struktúrát.
Ez a struktúra a csúcspontokra csak a 3D pozíciójukat és a színüket tárolja.
Az FVF konstans a vertex formátum kódot írja le a D3D részére.
Példa – kocka drótváz definiálása
► A csúcspontok tömbjének definiálása
• Minden élre 2 csúcspontot kell definiálni (24 csúcspont lesz összesen).
• Összesen 12 él létezik.
(0, 1, 0)
(0, 1, 1) (1, 1, 1)
(1, 0, 1) (1, 0, 0)
(0, 0, 0)
(0, 0, 1)
y
z x Csúcspontok (élek):
(0,0,0) → (0,0,1) (0,0,1) → (1,0,1) (1,0,1) → (1,0,0) (1,0,0) → (0,0,0) (0,1,0) → (0,1,1) (0,1,1) → (1,1,1) (1,1,1) → (1,1,0) (1,1,0) → (0,1,0) (0,0,0) → (0,1,0) (0,0,1) → (0,1,1) (1,0,1) → (1,1,1) (1,0,0) → (1,1,0)
(1, 1, 0)
© Nagy Attila és társai, ÓE NIK 122 www.tankonyvtar.hu
Példa – kocka drótváz definiálása
► A csúcspontok tömbjének definiálása (C#)
Példa – kocka drótváz definiálása
► Észrevételek
Egyszerű alakzatok definiálásakor is rengeteg csúcs szükséges.
Bővebb vertexformátum használatakor nagy memória- és sávszélességigény!
A primitívek definiálása nagyon redundáns!
(Ugyanaz a csúcspont sokszor szerepelhet.)
© Nagy Attila és társai, ÓE NIK 124 www.tankonyvtar.hu
Geometria definiálása (7)
► A nagy sávszélességigény csökkentésére két főbb technika létezik
Az indexelt geometria alkalmazása
A csúcspont és index puffer objektumok
(vertex buffer, index buffer)
Indexelt geometria (1)
► Egy kockának 8 csúcsa van, mégis 24
csúcsot kellett definiálni az előző példában.
(0, 1, 0)
(0, 1, 1) (1, 1, 1)
(1, 0, 1) (1, 0, 0)
(0, 0, 0)
(0, 0, 1)
y
z x Csúcspontok (élek):
(0,0,0) → (0,0,1) (0,0,1) → (1,0,1) (1,0,1) → (1,0,0) (1,0,0) → (0,0,0) (0,1,0) → (0,1,1) (0,1,1) → (1,1,1) (1,1,1) → (1,1,0) (1,1,0) → (0,1,0) (0,0,0) → (0,1,0) (0,0,1) → (0,1,1) (1,0,1) → (1,1,1) (1,0,0) → (1,1,0)
(1, 1, 0)
© Nagy Attila és társai, ÓE NIK 126 www.tankonyvtar.hu
Indexelt geometria (2)
► Minden csúcs háromszor lett felvéve, mert 3 élben szerepelt! (redundancia)
► Megoldás
Szükségtelen a csúcsokat annyiszor definiálni, ahány primitívben részt vesznek.
Újradefiniálás helyett elég hivatkozásokat (indexeket) eltárolni a definiált csúcsokra!
Ekkor a geometria leírása egy csúcspont és egy
csúcspont indextömb segítségével történik.
Indexelt geometria (3)
► Az indexelt csúcstömb definiálása
8 db csúcsot kell definiálni
24 db indexre van szükség
E=(0, 1, 0)
F=(0, 1, 1) G=(1, 1, 1)
C=(1, 0, 1)
D= (1, 0, 0) A=(0, 0, 0)
B=(0, 0, 1)
y
z x Csúcsok:
(0,0,0) (0,0,1) (1,0,1) (1,0,0) (0,1,0) (0,1,1) (1,1,1) (1,1,0)
H=(1, 1, 0)
Csúcs indexek (élek):
A→B B→C C→D D→A E→F F→G G→H H→E A→E B→F C→G D→H
© Nagy Attila és társai, ÓE NIK 128 www.tankonyvtar.hu
Indexelt geometria (4)
► Indexelt csúcsponttömb definiálása (C#)
Indexelt geometria (5)
Kocka drótváz Indexelt kocka drótváz Csúcsok
száma 24 8
Indexek
száma 0 24
Memóriaigény 24 * sizeof(VertexPosition) =
384 byte 8 * sizeof(VertexPosition) + 24
* sizeof(ushort) = 176 byte
sizeof(VertexPosition) = 16 byte sizeof(ushort) = 2 byte
Ebben a példában az indexelt geometria alkalmazása kb. felére csökkentette a
szükséges memóriaigényt (és sávszélesség- igényt).
© Nagy Attila és társai, ÓE NIK 130 www.tankonyvtar.hu
Csúcspont és index pufferek
► A geometriát leíró csúcspont- és
indextömbök a GPU memóriájában is tárolhatók.
► A csúcspont és index pufferek segítségével a GPU memóriájába helyezhetők az adatok.
► A sávszélesség okozta szűk keresztmetszet
teljesen áthidalható ezekkel; a megjelenítés
többszörösére gyorsítható használatukkal.
Tartalomjegyzék
► Geometria definiálása
► Rajzolási állapotok
► Rajzolási utasítások
© Nagy Attila és társai, ÓE NIK 132 www.tankonyvtar.hu
Rajzolási állapotok
Rajzolási állapotok (1)
► A geometria definiálása, és a szükséges erőforrások betöltése után még a kívánt rajzolási állapotokat is be kell állítani.
► A rajzolási állapotok megadása után történhet csak a tényleges rajzolás.
© Nagy Attila és társai, ÓE NIK 134 www.tankonyvtar.hu
Rajzolási állapotok (2)
► A rajzolási állapotok célja
Az aktuálisan rajzolt primitívek rajzolási paramétereinek meghatározása.
Nem kell minden primitív rajzolásakor az összes lehetséges rajzolási paramétert megadni
(állapotfüggő rajzolás).
Rajzolási állapotok beállítása forráskódból, pl.:
Device d3dDevice = …;
d3dDevice.SetRenderState(RenderState.ZEnable, true);
d3dDevice.SetRenderState(RenderState.FogColor, new Color3(0.0f, 0.5f, 1.0f));
d3dDevice.SetTransform(0, Matrix.Translation(0, 1, 2));
d3dDevice.SetTexture(0, textureObject);
Rajzolási állapotok (3)
► A főbb rajzolási állapotok:
Alfa keverés (alpha blending)
Alfa tesztelés (alpha testing)
Ambiens világítás (ambient lighting)
Élsimítás (antialiasing)
Hátsólap eldobás (culling)
Mélységi pufferelés (depth buffer state)
Köd (fog)
Megvilágítás (lighting)
Poligonkitöltés (outline and fill)
Csúcspontszínezés (per-vertex color)
Primitívvágás (primitive clipping)
Árnyalás (shading)
Stencil puffer (stencil buffer)
Textúra kifeszítés (texture wrapping)
Textúra mintavételezés (texture sampling states)
© Nagy Attila és társai, ÓE NIK 136 www.tankonyvtar.hu
Rajzolási állapotok (4)
► A rajzolási állapotok állítása időigényes
művelet (a konkrét sebesség állapotfüggő).
► A költséges állapot átállításokat kerülni, minimalizálni szokták.
A hasonló állapotot igénylő primitíveket egymás után, csoportosan rajzolják ki.
Ha gyors rajzolási sebesség elérése a cél, nem
mindegy, mit milyen sorrendben rajzolunk ki!!
Tartalomjegyzék
► Geometria definiálása
► Rajzolási állapotok
► Rajzolási utasítások
© Nagy Attila és társai, ÓE NIK 138 www.tankonyvtar.hu
Rajzolási utasítások
Rajzolási utasítások (1)
► A geometria definiálása, és az állapotok
beállítása után a primitívek megjeleníthetők.
► A rajzolásra a D3D több metódust is biztosít.
DrawUserPrimitives
DrawIndexedUserPrimitives
DrawPrimitives
DrawIndexedPrimitives
© Nagy Attila és társai, ÓE NIK 140 www.tankonyvtar.hu
Rajzolási utasítások (2)
► DrawUserPrimitives
Megadható a primitív típusa
A csúcspontokat tároló tömb
Az első rajzolandó csúcspont indexe és a kirajzolandó primitívek száma
Primitívek rajzolása adott csúcspont tömbből, pl.:
Rajzolási utasítások (3)
► DrawIndexedUserPrimitives
Indexelt geometria megjelenítését teszi lehetővé.
Külön megadható a csúcspont puffer, az index puffer illetve további kapcsolódó paraméterek.
© Nagy Attila és társai, ÓE NIK 142 www.tankonyvtar.hu