Otthon » Gomba feldolgozás » Mélységi puffer (Z-puffer). A láthatatlan élek eltávolítása

Mélységi puffer (Z-puffer). A láthatatlan élek eltávolítása

Egy másik brute force módszer a Z -buffer, ami az algoritmus és a benne használt műveletek egyszerűsége miatt nagyon kényelmes hardveres megvalósításhoz. Ennek a módszernek az időbeli jellemzői lineárisan függenek a raszterpontok számától és a „színhely mélységi összetettségétől”, azaz. az egymást kölcsönösen fedő arcok átlagos száma.

A módszer megvalósításához két memóriaterületet használnak: a mélységi puffert ( Z -buffer) és frame buffer (a számítógép képernyőjének pixeleinek állapotáról információkat tárol). A hosszpuffer a koordináták tárolására szolgál Z A képelemzés ezen szakaszában látható képsík egyes pixeleinek (mélysége). A keretpuffer tárolja a megfelelő képpont attribútumait (intenzitás és szín).

A módszer formai leírása a következő. Tegyük fel, hogy a jelenet sokszögek uniójaként van ábrázolva (esetleg egymást metsző). Szerkesszük meg a jelenet ortogonális vetületét a képsíkra.

A következő lépéssorozatot feltételezzük:

14. Sima térképek vetületeinek jellemzői

1. eset

Egy adott felület az egyenlettel leírt sík Z = Xés az X = 0 síkra vetítve (1. ábra).

Egyenletét X-Z=0, Vector implicit alakba írva L, amely mentén a tervezést végzik, koordinátái vannak

Számítsuk ki a normálvektor koordinátáit:

Ennek a két vektornak a skaláris szorzata nem nulla:

Így a vizsgált felület vetületi vektora és normálvektora egyik pontban sem merőleges. Vegyük észre, hogy a kapott vetületnek nincsenek szingularitásai.

2. eset

Az adott felület egy parabola henger, amelynek egyenlete Z = X2 vagy ami megegyezik, X2 - Z = 0. Normál vektor merőleges az L vetületi vektorra az Y tengely pontjaiban Ez abból következik .

Itt az első esettel ellentétben az X = 0 sík pontjait három osztályba osztjuk: az elsőbe azok a pontok tartoznak (Z > 0), amelyeknek két inverz képük van (ez az osztály a 2. ábrán árnyékolva van); a másodikra ​​azokat, amelyeknek egy előképe van (Z = 0);

A harmadik osztályba azok a pontok tartoznak, amelyeknek egyáltalán nincs prototípusa a hengeren. Az X = 0, Z = 0 egyenes speciális. Mellette vektorok vannak És ortogonális. Ezt a fajta jellemzőt ún hajtogatni.

3. eset

Vegye figyelembe a felületet egyenlettel adott X 3 + XY - Z = 0.

Hadd Y=1. Ekkor Z = X 3 + X (3. ábra).

at Y=0 van: Z = X 3 (4. ábra).

3. ábra

rizs. 4

Végül, mikor Y=1 kapjuk: Z = X 3 - X (5. ábra).

rizs. 5

A megépített szakaszok képet adnak a teljes felületről. Ezért most már könnyű megrajzolni (6. ábra).

16. Szegmens raszteres letapogatása

Vízszintes, függőleges és 45°-os dőlésszögű dőlésszögekhez. szegmensek esetén kézenfekvő a raszterelemek kiválasztása. Bármilyen más tájolás esetén nehezebb kiválasztani a kívánt pixeleket. A szegmens képére vonatkozó általános követelmények:

A szegmens végeinek be kell esni adott pontokat;

· a szegmenseknek egyenesnek kell lenniük,

· a szegmens mentén a fényerőnek állandónak kell lennie, és függetlennek kell lennie a hossztól és a meredekségtől.

Ezen feltételek egyike sem teljesíthető pontosan raszteres megjelenítésen, mivel a kép véges méretű pixelekből épül fel, nevezetesen:

· a szegmens végei általában olyan pixeleken helyezkednek el, amelyek csak a legközelebb vannak a kívánt pozíciókhoz, és csak speciális esetekben a szegmens végeinek koordinátái pontosan egybeesnek a pixelek koordinátáival;

· egy szegmenst egy pixelhalmaz közelít, és csak speciális függőleges, vízszintes és 45  szegmensek esetén tűnnek egyenesnek

· a fényerő a különböző szegmensekben és még egy szegmens mentén is általában eltérő, mivel például a függőleges szegmens és a 45  szegmens képpontjainak középpontjai közötti távolság eltérő

Szegmensgenerálási algoritmusok:

1) Digitális differenciálelemző. Megoldásra kerül egy dY/dX = Py/Px alakú differenciálegyenlet, ahol Py = Yk - Yn a szakasz koordinátáinak növekménye az Y tengely mentén, Px = Xk - Xn pedig a szakasz koordinátáinak növekménye. szegmens az X tengely mentén Ebben az esetben a CDA ennek a differenciálegyenletnek a folytonos megoldásának diszkrét közelítését képezi A hagyományos digitális adatelemzésben, amelyet általában vektoros eszközökben használnak, a szegmens közelítésére használt N csomópontok számát így vagy úgy határozzák meg. Ezután N ciklusban kiszámítjuk a következő csomópontok koordinátáit. Az így kapott X i , Y i értékeket a rendszer a következő kiemelt pixel koordinátáinak egész értékévé alakítja vagy kerekítéssel vagy a tört rész elvetésével. Az ezt az algoritmust használó vektorgenerátor hátránya, hogy a pontokat kétszer lehet regisztrálni, ami megnöveli az építési időt. Ráadásul mindkét koordináta független számítása miatt nincsenek preferált irányok, és a megszerkesztett szakaszok sem tűnnek túl szépnek.

2) Bresenham algoritmus. Mivel a koordináta-növekmény általában nem kettő egész hatványa, a DDA-algoritmus osztást igényel, ami nem mindig kívánatos, különösen hardveres implementáció esetén. Bresenham olyan algoritmust javasolt, amely nem igényel osztást, mint az aszimmetrikus DDA-algoritmusban, de biztosítja, hogy a generált kép eltérése a valódi szegmenstől minimális legyen, mint a hagyományos DDA-algoritmusban. Az algoritmus fő gondolata az, hogy ha a lejtő egyenes< 1/2, то естественно точку, следующую за точкой (0,0), поставить в позицию (1,0) (рис. а), а если угловой коэффициент >1/2, majd - az (1,1) pozícióba (b. ábra). A következő képpont hozzáadásának eldöntéséhez két lehetséges raszterpont közötti pontos pozíció középtől való E eltérését kell megadni a legkisebb relatív koordináta irányában. Az E jel a legközelebbi raszterpont kiválasztásának kritériuma. Ha E< 0, то pontos Y-érték az Y utolsó alsó egész értékére kerekítve, azaz. Az Y koordináta nem változik az előző ponthoz képest. IN egyébként Y 1-gyel nő.

3) Módosított Bresenham algoritmus. Az algoritmus fő gondolata, hogy a sokszög éleinek pixelfényességét a sokszög belsejébe eső képpont területével arányosan állítsa be.

A rasztergrafikus eszközök egyik egyedülálló tulajdonsága, hogy képes tömör területeket ábrázolni. Az élek vagy csúcsok egyszerű leírásából szilárd régiók létrehozását tömör területek raszteres letapogatásának, sokszögek kitöltésének vagy kontúrok kitöltésének nevezik. Ehhez többféle módszert használhat, amelyeket általában 2 kategóriába sorolnak: raszteres szkennelés és magfeltöltés.

A raszteres letapogatási módszerek a vonalak pásztázási sorrendjében próbálják meghatározni, hogy egy pont egy sokszögen vagy egy körvonalon belül van-e. Ezek az algoritmusok általában a sokszög "tetejétől" az "aljáig" mennek.

A magfeltöltési módszereknél feltételezzük, hogy egy zárt körvonalon belül egy bizonyos pont (mag) ismert. Az algoritmusok a maggal szomszédos és a kontúron belül található pontokat keresik. Ha a szomszédos pont nincs a kontúron belül, akkor a rendszer a kontúr határát érzékeli. Ha a pont a kontúron belül található, akkor ez lesz a magpont, és a keresés rekurzív módon folytatódik. Az ilyen algoritmusok csak raszteres eszközökre alkalmazhatók.

Sok zárt körvonal egyszerű sokszög. Ha a kontúr görbe vonalakból áll, akkor megfelelő sokszöggel vagy sokszögekkel közelíthető. A sokszög kitöltésének legegyszerűbb módja annak ellenőrzése, hogy a raszter minden egyes pixele a sokszög belsejéhez tartozik-e. Ez a módszer túl pazarló. A költség csökkenthető, ha egy sokszögre egy téglalap alakú héjat számítunk – a legkisebb sokszöget, amelyen belül sokszög található.

Először Catmull javasolta. Az algoritmus működéséhez a keret (szín) pufferrel együtt egy azonos méretű mélységi puffer vagy Z-puffer szükséges. Megkülönböztető tulajdonság Az algoritmus az egyszerűsége. Az algoritmus képtérben működik. Az algoritmus fő lépései a következők:

  • keretpuffer kitöltése háttér intenzitással vagy színértékkel, z-puffer kitöltése minimális érték z színpadra. Ha szükséges, távolítsa el a nem néző éleket;
  • raszterizálja a jelenet minden sokszögét (a sorrend tetszőleges);
  • a sokszög (x, y) koordinátájú minden pontjára számítsa ki a mélységét z(x, y);
  • hasonlítsa össze a kapott z(x, y) mélységet az (x, y) pozícióban tárolt Z pufferértékkel;
  • ha z(x, y) > Z puffer (x, y), akkor írja be ennek a sokszögnek az attribútumait (intenzitás, szín stb.) a keretpufferbe, és cserélje ki a Z puffer(x, y)-t z-re (x, y) ) ;
  • ellenkező esetben ne végezzen semmilyen műveletet;

8.8. ábra Az algoritmus vázlata.

Az algoritmus működését szemléltető diagram az ábrán látható. 8.8.

A láthatatlan vonalak eltávolítása mellett az algoritmus megoldja a láthatatlan felületek eltávolításának problémáját, és triviálissá teszi az összetett felületek metszéspontjainak megjelenítését. A jelenetek bármilyen bonyolultságúak lehetnek. Mivel a keretpuffer mérete rögzített, az algoritmus számítási bonyolultságának becslése nem több, mint lineáris. Mivel egy jelenet vagy kép elemei tetszőleges sorrendben bevihetők a framebufferbe vagy a z-bufferbe, nincs szükség a mélységi prioritás szerinti előzetes rendezésre.

Az algoritmus nagy mennyiségű memóriát igényel, mivel a mélységi információkat meglehetősen nagy pontossággal kell feldolgozni. Az 1024x768x24 bites színpuffer 20 bites mélységű z-pufferrel kombinálva körülbelül 5 megabájt memóriát igényel. A szükséges memória csökkentése a képterület több részre (négyzetekre vagy csíkokra) való felosztásával érhető el. Ha egy letapogatási sor méretű z-puffert használunk, érdekességet kapunk soronkénti szkennelési algoritmus. Mivel minden jelenetelemet többször dolgoznak fel, a z-puffer szegmentálása általában megnöveli a jelenet feldolgozásához szükséges időt. A síkbeli rendezés azonban, amely elkerüli az egyes szegmensek összes sokszögének feldolgozását, jelentősen csökkenti a számítási költségeket.

Másik hiba A z-puffer algoritmussal az a probléma, hogy nehéz kiküszöbölni a lépcsőházhatást, valamint az átlátszóság és az átvilágítási effektusok megvalósítása. A problémák a keretpuffer feltöltésének véletlenszerű sorrendje miatt merülnek fel. Mivel az algoritmus véletlenszerű sorrendben helyezi el a képpontokat a framebufferben, nem könnyű megszerezni a szükséges információkat az előszűrésen alapuló lépcsőzet-ellenes technikák segítségével. Ugyanezek az okok vezetnek hibákhoz az átlátszósági és áttetszőségi hatások megvalósítása során.

4.11. INTERVALUS SCAN ALGORITMUS

A z-puffer vonal letapogatási algoritmusában a sokszög mélységét a rendszer a pásztázási vonalon lévő minden egyes pixelre kiszámítja. A mélységszámítások száma csökkenthető a Watkins-algoritmusban először bevezetett intervallum fogalmával. ábrán. Az 1. ábra a jelenet sokszögeinek metszéspontját mutatja a pásztázási síkkal. A láthatatlan felületek eltávolításának problémájának megoldása az egyes intervallumokban látható szegmensek kiválasztásában rejlik, amelyet úgy kapunk, hogy a pásztázási vonalat elosztjuk az élek metszéspontjainak vetületeivel.

Az ábra azt mutatja, hogy csak három lehetőség lehetséges:

Rizs. 8.9. A soronkénti szkennelés intervallumai.

Az intervallum üres, például az 1. intervallum az ábrán. 8.9.a). – az intervallumot reprezentáló pixelek háttérszínnel rendelkeznek.

Egy intervallum csak egy szegmenst tartalmaz, például a 2. és 4. intervallumot az ábrán. 8.9.a. - megjelennek a szakasznak megfelelő sokszög attribútumai.

Egy intervallum több szegmenst tartalmaz, például a 3. intervallumot az ábrán. 8.9.a). Ebben az esetben az intervallum minden szegmensének mélysége kiszámításra kerül. A maximális r értékkel rendelkező szegmens lesz látható ebben az intervallumban.

Ha a sokszögek nem tudják áthatolni egymást, akkor elég kiszámítani az egyes szakaszok mélységét az intervallumban az egyik végén. Ha két szegmens érinti, de nem hatol át az intervallum végein, akkor a mélységszámítás az intervallum közepén történik, amint az ábra mutatja. 8.9 b) . A 3. intervallum esetében a jobb végén végzett mélységszámítás nem engedi elfogadni határozott döntés. A mélység számításának végrehajtása az intervallum közepén már a helyes eredményt adja.

Ha a sokszögek átüthetik egymást, akkor a pásztázási vonalat nem csak az élek és a pásztázási sík metszéspontjainak vetületei osztják fel, hanem a páronkénti metszéspontjaik vetületei is, amint az az ábrán látható. 8.9 c). Az ilyen intervallumok végpontjainál a mélység kiszámítása bizonytalan eredményeket ad. Ezért elegendő a mélységet az egyes intervallumok közepén kiszámítani. Többet használva összetett módszerek intervallumokat generálva csökkenthető a számuk, és ezáltal a számítási bonyolultság

WARNOCK ALGORITMUS

Warnock algoritmusa azon a hipotézisen alapul, hogy egy személy a vizuális észlelésben környezet, összetett objektumokra összpontosít (teherhordó nagy számban információk), és az egyszerű tárgyakat vagy töredékeket minimális erőfeszítéssel tanulmányozzák. Az algoritmus működése során a kép külön részekre oszlik. Ezután minden rész kap egy nehézségi osztályt. Ha a kapott rész elég egyszerű, akkor dönthetünk a láthatóságáról, ellenkező esetben törve folytatjuk a vizsgálatot ezt a részt alrészekre. Így jellemezhető így rekurzív algoritmus, képtérben működő.

Az algoritmus eredeti változatában az eredeti téglalap alakú ablak négy egyenlő részre van osztva. Egy ablak tétlen, ha üres, vagy elérte a képernyőfelbontás korlátját. Ha az algoritmus eltávolítja a láthatatlan vonalakat, egy üres ablak triviálisan megtelik a háttérszínnel. A láthatatlan felületek eltávolításakor az üres ablakot a rendszer emellett ellenőrzi, hogy lefedje a jelenetpoligonok. Ha a rendszer több befoglaló sokszöget észlel, az ablak a megfigyelési ponthoz legközelebbi színnel lesz kitöltve.

8.10. ábra Ablakfelosztási séma a Warnock-algoritmusban

A felbontási határ elérésekor általában egy pixel van az ablakban (amikor az erdőhatás megszűnik, és néhány más esetben a felosztás tovább folytatódhat. Egy pixel színét a részei színének mérlegelésével határozzuk meg). Az ablak láthatóságának meghatározásához a befoglaló sokszögek és sokszögek közül a legközelebbit is megtaláljuk, amelyek határaihoz ez a pixel tartozik. Egy egyszerű jelenet Warnock algoritmussal történő feldolgozásakor számos kezdeti ablakfelosztás diagramja látható a 8.10. ábrán. Az első felosztás során az 1a részablak üresnek bizonyult. Az 1c ablak felosztása (az alablakok megtekintésének sorrendje nem fontos. Az alablakokat balról jobbra, fentről lefelé nézzük) szintén négy részablakot kapunk. A 2a ablak üres, kitölthető a háttérszínnel. A 2b ablak is felosztást igényel. Ezen ablakfelosztási séma alapján, ha a képernyő felbontása 1024*1024, akkor tíz felosztás után érjük el a képernyőfelbontás határát (1024 = 2 10).

8.11. ábra Egy ablak felosztása téglalap alakú sokszöghéj alapján.

Számos módosítást fejlesztettek ki ennek az algoritmusnak a jelenetfeldolgozás számítási költségeinek csökkentése. Az algoritmus fejlesztésének fő irányai a következők:

· Eltérés a rögzített ablak felezési szabályától. A képfeldolgozás hatékonyabb, ha az ablak elválasztó vonalainak helyzete a tartalmától függ. Például egy ablak fel van osztva a benne lévő sokszög téglalap alakú befoglaló héja alapján, ahogy az a 8.11. ábrán látható;

· Az egyszerű ablaktartalom fogalmának kiterjesztése (ehhez a felosztás nélküli láthatóságról döntenek). Ehhez átgondoljuk a sokszög ablakhoz viszonyított lehetséges helyeit, és bemutatjuk a belső, külső, metsző és befoglaló sokszög fogalmát. Ezen fogalmak alapján az ablakok feldolgozásának szabályai egyszerű tartalom. Példa erre lenne következő szabály: ha az ablakban csak egy belső sokszög van, és az ablaknak nincsenek befoglaló sokszögei, akkor a poligonon kívüli ablakterületet a háttérszínnel festjük, magát a sokszöget pedig a megfelelő színnel töltjük ki;

· Eltérés az ablak téglalapokra való felosztásától. Példa a munka során kapott algoritmusra ebben az irányban az alábbiakban tárgyalt Weiler-Atherton algoritmus.

WEILER-AZERTON ALGORITMUS

A kívánt pontosság elérése érdekében az algoritmus objektumtérben működik. Mivel a kimenet sokszög, az algoritmus könnyen használható a láthatatlan vonalak és a láthatatlan felületek eltávolítására. Az algoritmus négy lépésből áll.

· Előzetes válogatás mélység szerint (Zmax szerint).

· Sokszögek rendezése síkon.

· A megfigyelési ponthoz legközelebbi sokszög által átvilágított sokszögek eltávolítása.

· Ha szükséges, rekurzív felosztás és végső rendezés a bizonytalanságok kiküszöbölése érdekében.

A hozzávetőleges prioritások listájának létrehozásához előzetes mélység szerinti rendezésre van szükség. A megfigyelési pontot úgy tekintjük, hogy a pozitív z tengelyen a végtelenben helyezkedik el. A hozzá legközelebb eső és a listában első sokszög az lesz, amelynek csúcsa a maximális Z koordinátájú .

8.12. ábra. Tesztpélda.

Az első sokszög másolata innen előzetes lista prioritások mélységében. Két lista kerül megadásra: belső és külső A síkon történő rendezés alapján minden sokszög le lesz vágva a vágási sokszög határai mentén. Rendezés repülőn ill xy–a szortírozás a vágási és vágási sokszög vetületeinek metszéspontjának kétdimenziós művelete. A kivágási sokszögek azon részei, amelyek a vágópoligonon belülre esnek, szerepelnek a belső listában. A vágási határon kívül maradó sokszögek vagy sokszögrészek egy külső listát alkotnak. A 8.12. ábrán látható jelenet első rendezésének eredménye az ábrán látható. 8.13

8.13. ábra Rendezés síkon.

Ezután a belső listából származó sokszögek összes csúcsának mélysége összehasonlításra kerül a kivágott sokszög mélységével. Ha ezen csúcsok egyikének sem a mélysége nagyobb, mint a Zmin levágási érték, akkor a belső lista összes poligonját a vágási sokszög szűri. Ezeket a sokszögeket eltávolítja, és megrajzol egy vágópoligont. Az algoritmus ezután a következővel folytatódik: külső lista. Ha a Z koordináta . Ha a belső listából bármelyik sokszög nagyobb, mint a vágási sokszög Zmin-je, akkor egy ilyen sokszög legalább részben kiszűri a vágási sokszöget. Ezért a mélységi válogatás eredménye hibás. A nem megfelelő sokszög új vágási sokszögként kerül kiválasztásra. A belső listából származó sokszögek kivágásnak vannak kitéve, és a régi vágási sokszöget az új vágópoligon fogja levágni. Hangsúlyozzuk, hogy az új kivágási sokszög az eredeti sokszög másolata, és nem az első kivágás utáni maradéka. A levágott sokszög másolatának használata minimalizálja a felosztások számát.

A szükségtelen rekurzív felosztás megakadályozható, ha létrehoz egy listát azokról a sokszögekről, amelyeket már használt vágott sokszögként. Ezután, ha az aktuális vágott sokszög megjelenik ebben a listában a rekurzív felosztás során, akkor a rendszer ciklikusan átfedő sokszöget észlel. Ezért nincs szükség további particionálásra.


©2015-2019 oldal
Minden jog a szerzőket illeti. Ez az oldal nem igényel szerzői jogot, de ingyenesen használható.
Az oldal létrehozásának dátuma: 2016-08-20

Létrehozás dátuma: 2010-03-18 14:07:57
Utoljára szerkesztve: 2012-03-01 02:48:07

Ma mélységi pufferrel egészítjük ki programjainkat. A mélységi puffer kiküszöböl egy meglehetősen kellemetlen hibát, amely a következő képen látható:

IN ebben a példában Olyan kockát használtam, amelynek két szemközti csúcsa színezett különböző színek: elöl felső sarok- piros színű, hátul alsó sarok- zöld szín.

A képen A az objektum rosszul van megrajzolva. Itt látjuk a modell "belsejét" (hátsó háromszögeket). Eddig minden tárgyunk pontosan így készült. A képen b helyesen megrajzolt objektum jelenik meg. Valójában a mai órán az a feladatunk, hogy megtanuljuk, hogyan kell háromszögeket rajzolni a megfelelő sorrendben.

Miért jelenik meg helytelenül az a ábrán látható kocka? Alapértelmezés szerint a Direct3D a háromszögeket abban a sorrendben jeleníti meg, ahogyan azokat meghatározták. Ügyeljen a képen látható kocka jobb oldali falára A. Itt jól látható, hogy milyen sorrendben rajzolták a háromszögeket: elülső fal, hátsó, jobb, alsó.

Ez a példa lehetővé teszi, hogy megértse a háromszögek rajzolási sorrendjének fontosságát. A háromszögeket a legtávolabbitól a legközelebbiig kell megrajzolni. Annak meghatározásához, hogy melyik háromszög található közelebb a kamerához, z koordinátákat használunk így vagy úgy.

Háromszög rendezés

Mielőtt megvizsgálnánk, hogyan határozzák meg a háromszögek sorrendjét a DirectX-ben, először megismerjük a korábban használt módszert.

A legegyszerűbb eset, ha a háromszögek párhuzamosak a vetítési síkkal:

Az a ábra felülnézet, a b ábra a végső kép. IN ebben az esetben Nagyon könnyű meghatározni a háromszögek sorrendjét:
1. Mindkét háromszög bármely csúcsának z értékét fel kell venni.
2. Rendezze (például buborékos módszerrel) a háromszögeket z érték szerint.
3. Rajzolj háromszögeket z csökkenő sorrendben: először a legtávolabbi háromszögek rajzolódnak ki, majd a legközelebbiek.

Ha a háromszögek egyike (vagy mindkettő) nem párhuzamos a vetítési síkkal, akkor általában a három csúcs z-pontszámának átlagát vesszük, vagy csak az első csúcs z-pontszámát. Mindenesetre előfordul némi hiba (sőt, kicsi és elhanyagolható).

A legfontosabb itt az, hogy a háromszögeket z-érték szerint rendezzük, majd a z-érték függvényében jelenítjük meg: a legnagyobbtól a legkisebbig.

Több is van összetett esetek háromszögek elrendezése, ahol az egyszerű rendezés helytelen eredményt ad:

A képen látható háromszögek elrendezése valós helyzetekben valószínűtlen, de ennek ellenére érdemes megfontolni az esetet. Itt nem csak a z-koordináta rendezést használhatja. Ahhoz, hogy ezeket a háromszögeket helyesen jelenítse meg, kisebbre kell vágnia őket. Ezt nem olyan könnyű megtenni.

Jelenleg a háromszögek rendezése helyett egy gyorsabb módszert használnak a háromszögek sorrendjének meghatározására - a mélységi puffert.

Mélységi puffer a DirectX-ben

A mélységi puffer pontosan ugyanaz a felület, mint a háttérpuffer. Sőt, a mélységi puffer mérete az elemek számát tekintve mindig mérettel egyenlő háttérpuffer/főfelület.

A mélységi puffer a háromszögek pixeleinek (!!!) z koordinátáit tárolja. Emiatt a mélységi puffert z-puffernek is nevezik.

Fontos megérteni, hogy a z-puffer mikor töltődik be.

A vetületi síkra konvertálás után (ez valójában nem sík, inkább fél kocka) a csúcsok x és y értékei -1 és 1 között vannak. A z értékek nulla és egy között vannak.

Amint azt az utolsó leckében megtudtuk, a képet ezután megfordítják (az összes csúcs y-koordinátáját -1-gyel megszorozva), és a képet „függőlegesen és vízszintesen az ablak méretére nyújtják”. Ezt követően az összes csúcs x és y koordinátája a nullától a szélesség/magasság közötti tartományban lesz. Vegyük észre, hogy itt az x, y koordináták már egész számok lesznek (a vetítési síkban törtek voltak), mert ezek már az ablakban lévő pixelek koordinátái. A pixelekre nem hivatkozhat 25,5 vagy 126,0023 néven, csak 25 vagy 126. V pillanatnyilag Még nincsenek háromszögek, csak csúcsok, amelyek leírják ezeket a háromszögeket. Ugyanakkor ezeknek a csúcsoknak a z koordinátái mindvégig változatlanok maradnak - a szakaszon helyezkednek el.

Ezt követően a z-puffer feltöltődik. Először is, minden eleme a maximális értékre van állítva. Mivel a csúcsok z koordinátáit a vetítési síkból vettük, a maximális érték egy lesz. Ha a z koordinátákat a kameratérből vennénk (ez az opció is megvalósítható), akkor a maximális érték a távoli vágósík z-koordinátájával lenne egyenlő.

És csak most kezdik ellenőrizni az egyes háromszögek összes képpontját. A minimális z érték a mélységi pufferbe kerül - ez a képpont van a legközelebb a képernyőhöz, és lefedi a mögötte lévő összes képpontot.

Amint látjuk, ezt a módszert sok számítást igényel: minden háromszög minden pixelét ellenőrizzük. És ez a módszer lassabb lenne, mint a háromszögek rendezése, ha nem hardveresen, hanem szoftveresen tenné.

Szoftver és hardver renderelés

Ha az IDirect3D9::CreateDevice metódusban a második paramétert D3DDEVTYPE_HAL-ként adjuk meg, ez azt jelenti, hogy a raszterezés (és ezzel együtt a mélységi pufferrel kapcsolatos összes számítás) hardverben történik. Ha a D3DDEVTYPE_REF sikeres, akkor a számítások programozottan történnek.

Miben különbözik a szoftveres számítástechnika a hardveres számítástechnikától? A számítógép központi processzora bármilyen számítást elvégezhet (sőt a legtöbb amikor a processzor egyszerű aritmetikai műveletek végrehajtásával van elfoglalva). Amikor a Camera programban önállóan átalakításokat végeztünk, minden számítást programozottan végeztünk, pl. Erre írták speciális program(szorzási és transzformációs függvények). Ezt a programot ezután a központi processzor hajtotta végre. De a DirectX képes hardveres konverziók végrehajtására. Ehhez a SetTransform segítségével be kell állítani a transzformációs mátrixokat. A szoftveres számítástechnikában mindent a központi processzor végez. Hardverrel a számítást egy külön erre a feladatra kialakított fizikai eszköz végzi. De van egy probléma: ha a videokártya nem rendelkezik hardveres támogatással néhány funkcióhoz (például z-puffer vagy átalakítások), akkor mindent meg kell tenni központi processzor programozottan.

A hardveres számítások mindig gyorsabbak, mint a szoftveresek, mivel a hardveres számításokhoz van egy speciálisan optimalizált konkrét feladat, egy fizikai eszköz (tranzisztorok csoportja).

A legtöbb modern videokártya hardveres konverziót, z-puffert és még sok mást kínál. E szolgáltatások használatához az IDirect3DDevice9 eszközöket a D3DDEVTYPE_HAL jelzővel kell létrehozni. Különben minden grafikus rész a központi processzor fogja kezelni.

z-buffer használata DirectX-ben

A lecke első képéhez egy régi programot használtam, ahol a transzformációk automatikusan történtek, és a transzformációs mátrixokat a SetTransform segítségével adtam meg.

A D3DPRESENT_PARAMETERS struktúrában két mező van lefoglalva a z-puffer számára:

BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat;

Az első mező lehetővé teszi a mélységi puffer használatát ennek a készüléknek. A második jelző a mélységi puffer formátumát határozza meg. Jelenleg a mélységi puffer a z-puffert és a stencilpuffert együtt tárolja. A stencilpufferről később lesz szó.

A mélységi pufferformátumok a következők lehetnek (ez nem minden formátum):
D3DFMT_D16_LOCKABLE
16 bites zárható mélységi puffer.
D3DFMT_D32
32 bites mélységű puffer.
D3DFMT_D15S1
16 bites mélységű puffer. 15 bit z-puffercsatornánként, 1 bit stencil puffercsatornánként.
D3DFMT_D24S8
32 bites mélységű puffer. 24 bit - z-puffer, 8 bit - stencil puffer.
D3DFMT_D24X8
32 bites mélységű puffer. 24 bit - z-puffer, 8 bit nincs használatban.
D3DFMT_D24X4S4
32 bites mélységű puffer. 24 bit - z-puffer, 4 bit nem használt, 4 bit - stencil puffer.

A D3FMT_D24S8-at fogjuk használni. Egyelőre a stencil puffercsatorna üres lesz. A D3DPRESENT_PARAMETERS struktúra kitöltése most így fog kinézni:

D3DPRESENT_PARAMETERS pp; ZeroMemory(&pp,sizeof(pp)); pp.BackBufferWidth = 500; pp.BackBufferHeight = 500; pp.BackBufferFormat = D3DFMT_X8R8G8B8; pp.BackBufferCount = 1; pp.MultiSampleType = D3DMULTISAMPLE_NONE; pp.SwapEffect = D3DSWAPEFFECT_DISCARD; pp.hDeviceWindow = hWnd; pp.Ablakos = igaz; pp.EnableAutoDepthStencil = 1; pp.AutoDepthStencilFormat = D3DFMT_D24S8; pp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

A háttér és a fő felület létrehozásakor a Direct3D mélységi puffert is létrehoz. Ebben az esetben a háttér/főfelület elemeinek száma megegyezik a mélységi pufferben lévő elemek számával. Semmi mást nem kell tennünk, a többit a DirectX elvégzi helyettünk. Az egyetlen dolog, hogy a mélységi puffert minden képkockanál törölni kell (a háttérpuffert is). Ehhez használja a már ismert Clear módszert:

HRESULT Clear(DWORD Count, CONST D3DRECT * pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil);

A harmadik paraméter egy jelzőkészlet: D3DCLEAR_STENCIL, D3DCLEAR_TARGET, D3DCLEAR_ZBUFFER. Mivel a háttérpuffert és a mélységi puffert törölnünk kell, az utolsó két jelzőt adjuk meg. Az utolsó előtti argumentum az a z érték, amellyel a z-puffer összes eleme inicializálva lesz. Itt kell átvinni a z-puffer maximális értékét - egyet. Most egy példa a Clear metódus meghívására:

Dev->Clear(0, NULL, D3DCLEAR_TARGET | 3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0);

Ennyi.

z-puffer megjelenítési állapotok

A z-puffer viselkedésének szabályozására többféle állapot áll rendelkezésre:

D3DRS_ZENABLE
Lehetővé teszi a z-puffer engedélyezését/letiltását. Három lehetőség van: D3DZB_FALSE - z-puffer le van tiltva, D3DZB_TRUE - z-puffer engedélyezve van, D3DZB_USEW - w-buffer használata z-puffer helyett. Alapértelmezés szerint az állapot a D3DPRESENT_PARAMETERS struktúra EnableAutoDepthStencil mezőjének értékétől függően kerül felhasználásra.

D3DRS_ZWRITENABLE
Az állapottípus lehetővé teszi a z-pufferbe való írást. Az alapértelmezett érték IGAZ. Ha FALSE-ra van állítva, akkor a pixel z értékét teszteli, de új értékek nem kerülnek a z pufferbe. Szinte soha nem használt.

D3DRS_ZFUNC
Ez az állapottípus lehetővé teszi a pixelek összehasonlításának módját. Alapértelmezés szerint a pixel z-értéke összehasonlításra kerül a mélységi puffer z-értékével, és ha a pixel z-értéke kisebb vagy egyenlő, akkor új érték kerül a z-pufferbe. Ebben az esetben a D3DCMP_LESSEQUAL értéket használjuk (kevesebb - kevesebb, egyenlő - egyenlő). Azok. ezt a típust states lehetővé teszi a pixelmélység és a z-puffer értékek összehasonlításának függvényének módosítását. A D3DCMP_LESSEQUAL-on kívül más értékeket szinte soha nem használnak a gyakorlatban.

w-puffer és z-puffer

A z-pufferben lévő értékek a távoli és közeli vágási síkok arányától függenek. Ezen síkok bizonyos z koordinátáinál a z-pufferben lévő értékek egyenlőtlenül oszlanak el: nagy hatótávolság az értékek a játékos közelében összpontosulnak. Hasonló helyzetek gyakran korábban fordult elő, ha voltak nyílt terekés 16 bites z-puffert használtak. Ilyen esetekben közelről minden a szokásos módon jelenik meg, de távolról előfordulhat, hogy a háromszögek nem a megfelelő sorrendben rajzolódnak ki.

A probléma megoldására w-puffert használtak. Azok. a z koordináta helyett a homogént ellenőriztük. Nem minden videokártya támogatja a w-buffert. Most, hogy a legtöbb esetben 24 bites vagy akár 32 bites z-puffert használnak, nincs értelme w-puffert használni.

A z-buffer formátumok támogatásának ellenőrzése

Mint megtudtuk, a z-puffer meglehetősen nagy számítási teljesítményt igényel. A valós programokban a z-puffert hardverben kell létrehozni. De nem minden videokártya támogatja az összes mélységi pufferformátumot. Például a videokártyám nem támogatja a D3DFMT_D32-t. A DirectX képes ellenőrizni, hogy a videokártya mely mélységi puffer (és egyéb felületi) formátumokat támogatja. Ehhez használja az IDirect3D9::CheckDeviceFormat metódust. Ezt a metódust meg kell hívni a D3DPRESENT_PARAMETERS struktúra feltöltése előtt:

HRESULT CheckDeviceFormat (UINT Adapter, D3DDEVTYPE Eszköztípus, D3DFORMAT AdapterFormat, Duplaszó használat, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat);

UINT adapter
Az első paraméter határozza meg, hogy melyik grafikus adaptert kell ellenőrizni. Itt lehetséges különböző jelentések, ha egynél több videokártya van a számítógépen. A 0 vagy a D3DADAPTER_DEFAULT értéket adjuk át (ezek ugyanazok).

D3DDEVTYPE Eszköztípus
Eszköz típusa. A D3DDEVTYPE_HAL szinte mindig elküldésre kerül. Ez az eszköztípus azt mondja, hogy a hardver támogatása ellenőrzésre kerül.

D3DFORMAT AdapterFormat
Adapter képkimeneti formátum. Ide kerül a háttér/főfelületek formátuma.

Duplaszó használat
Paraméter, amely azt jelzi, hogy az ellenőrzött formátumú felület hogyan kerül felhasználásra. Mivel a mélységi puffert ellenőrizzük, át kell lépnünk a D3DUSAGE_DEPTHSTENCIL-en. További lehetséges értékeket a dokumentációban láthat: Direct3D Reference → Constants → D3DUSAGE.

D3DRESOURCETYPE Rtípus
Erőforrás típusa. Felületet keresünk (a mélységi puffer egy felület), így az érték D3DRTYPE_SURFACE lesz. További D3DRESOURCETYPE értékek a súgóban találhatók: Direct3D Reference → Enumerations → D3DRESOURCETYPE.

D3DFORMAT CheckFormat
Ellenőrizendő formátum.

Íme egy példa a D3DFMT_D24S8 formátum hardveres támogatásának ellenőrzésére:

EREDMÉNY óra = 0; hr = Eszközformátum ellenőrzése(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D24S8); if (hr != S_OK) ( // formátum nem támogatott )

Ha a formátum nem támogatott, a függvény az S_OK-tól eltérő értéket ad vissza.

Még egy megjegyzés az S_OK-ról. Amikor ellenőriztük a bemenetet a DirectInputban, ellenőrizni kell sikeres megvalósítása függvényekhez a DI_OK konstanst használtuk. A Direct3D-nek saját állandója van, amely ellenőrzi egy függvény sikeres végrehajtását - D3D_OK. Mindhárom konstans: S_OK, DI_OK, D3D_OK - azonos értékű - nulla. Bármelyiket használhatod.

Még egy dolog: az IDirect3D felület nem csak a felületi formátumok támogatását tudja ellenőrizni, hanem sok más dolgot is. További részletek az IDirect3D felület dokumentációs oldalán találhatók. Eszköz létrehozása előtt nagyon tanácsos ellenőrizni a hardver támogatását a programban használt összes szolgáltatáshoz.

Következtetés

Ma megtanultunk kétféleképpen rajzolni háromszögeket a megfelelő sorrendben.

A háromszög szerinti rendezés meglehetősen hatékony és könnyen megvalósítható szoftveres módszer. Nehéz helyzetek, amikor több háromszög valamilyen bizarr módon metszi egymást, ritkán fordul elő, és nem is lehet figyelembe venni. Ha nem lenne több gyors út, akkor beérhetnénk a háromszögek rendezésével.

A z-puffer hardverben van megvalósítva, így gyorsabb, mint a háromszög rendezés. Ezenkívül könnyen megbirkózik nehéz helyzetek amikor a háromszögek metszik egymást a térben. Ezenkívül a z-puffer könnyebben megvalósítható hardverben. Rendezéskor az adatok mozognak, és a z-puffer primitív teszteket használ: egy pixel z-értéke kisebb vagy egyenlő egy másik pixel z-értékével.

Mára ennyi. Hamarosan találkozunk.

Ez az egyik legegyszerűbb algoritmus a láthatatlan felületek eltávolítására. Először Catmull javasolta. Ez az algoritmus képtérben működik.

Az algoritmus fő előnye az egyszerűsége. Ezenkívül ez az algoritmus megoldja a láthatatlan felületek eltávolításának problémáját, és triviálissá teszi az összetett felületek metszéspontjainak megjelenítését. A jelenetek bármilyen bonyolultságúak lehetnek. Mivel a képtér méretei rögzítettek, az algoritmus számítási bonyolultságának becslése nem több, mint lineáris. Mivel egy jelenet vagy kép elemei tetszőleges sorrendben bevihetők a framebufferbe vagy a z-bufferbe, nem kell őket mélységi prioritás szerint előre rendezni. Ezért a mélységi rendezésre fordított számítási idő megtakarítható.

Az algoritmus fő hátránya a nagy memóriaigény. Ha a jelenet nézettranszformáción megy keresztül, és egy rögzített koordináta-tartományba van vágva zértékeket, akkor fix pontosságú z-puffert használhat. A mélységi információkat nagyobb pontossággal kell feldolgozni, mint a sík koordináta információkat (x, y); Általában 20 bit elég. Az 512*512*24 bites keretpuffer és az 512*512*20 bites z-puffer csaknem 1,5 megabájt memóriát igényel.

A z-puffer algoritmus másik hátránya, hogy munkaigényes és magas költség a lépcsőház hatás kiküszöbölése, valamint az átlátszósági és áttetsző hatások megvalósítása. Mivel az algoritmus véletlenszerű sorrendben helyezi el a képpontokat a framebufferben, nem könnyű megszerezni a szükséges információkat az előszűrésen alapuló lépcsőzet-ellenes technikák segítségével. Az átlátszóság és az átvilágító effektusok megvalósítása során előfordulhat, hogy a képpontok helytelen sorrendben kerülnek be a keretpufferbe, ami helyi hibákhoz vezethet.

A z-puffer algoritmus formális leírása:

1) töltse fel a keretpuffert a háttér intenzitásának vagy színének értékével;
2) töltse fel a z-puffert a minimális z értékkel;
3) alakítson át minden sokszöget tetszőleges sorrendben raszteres formává;
4) minden pixelhez (x, y) egy sokszögben számítsa ki a mélységét z(x, y);
összehasonlítani a mélységet z(x, y) a Zbuffer értékkel (x, y), a z-pufferben tárolva ugyanazon a helyen;
5) ha z(x, y) > Zpuffer(x, y), majd írja be ennek a sokszögnek az attribútumait (intenzitás, szín stb.) a keretpufferbe és cserélje ki Zpuffer(x, y)-on z(x, y);
6) ellenkező esetben ne tegyen semmit.

Előzetes lépésként, ahol praktikus, a nem arc széleinek eltávolítását alkalmazzák.

Algoritmus optimalizálás

A z-puffer algoritmus egyik leggyakoribb módosítása a hierarchikus z-puffer algoritmus. Nevezzünk rejtett (láthatatlan) arcot a z-pufferhez képest, ha annak minden pontjában a mélységük nem kisebb, mint a z-puffer megfelelő értékei (ha megpróbálunk egy ilyen arcot megjeleníteni a z-pufferben , semmi sem fog változni). Kocka ( kocka alakú) rejtettnek lesz nevezve a z-pufferhez képest, ha minden elülső felülete rejtett. Most kombináljuk a jelenet több szélét, és rajzoljunk köréjük egy kockát. Ahhoz, hogy ezeket a lapokat a z-pufferbe kiadjuk, ellenőrizzük, hogy a kocka rejtett-e a z-pufferhez képest. Ha ez a helyzet, akkor a kocka által egyesített összes lap el van rejtve a z-pufferhez képest, és nem kerül kimenőbe, ami csökkenti a számítások és a szükségtelen összehasonlítási műveletek számát. Ha ez nem így van, akkor még mindig nem látszik minden, a kocka által egyesített lap, és ezt a kockát részekre osztjuk, majd minden résznél ugyanazokat az összehasonlítási műveleteket hajtjuk végre. Így ennek az algoritmusnak a megvalósítása így nézhet ki alábbiak szerint. A teljes jelenet körül egy kockát írnak le, 8 részre osztják (szintén kockákra), és mindegyik részt további 8 részre osztják, és így tovább, amíg a kockában lévő lapok száma csökken. adott szám, amelynél már nincs értelme további részekre bontani. Ezután a következő kocka z-pufferbe történő kiadásához ellenőrizni kell, hogy rejtett-e vagy sem. Ha igen, akkor a kocka által egyesített összes lap figyelmen kívül lesz hagyva, ha pedig nem, akkor a megfelelő ellenőrzést minden részének elvégzik stb.

A z-puffer kimenetének további optimalizálása és a számítások számának csökkentése érdekében azt a tényt használjuk, hogy minél hamarabb kerül egy látható oldal a z-pufferbe, annál több láthatatlan felület kerül visszautasításra. Ehhez létrejön az előző keretben megjelenített arcok listája. A következő képkockában ezek az oldalak kerülnek ki először a z-pufferbe, mivel ebben a keretben szinte biztosan láthatóak maradnak.

Algoritmus használata z-puffer Ez az egyik legegyszerűbb algoritmus a láthatatlan felületek eltávolítására. Először Catmull javasolta. Ez az algoritmus képtérben működik. Ötlet z- A puffer a keretpuffer ötletének egyszerű általánosítása. A keretpuffer a képtérben lévő egyes pixelek attribútumai (intenzitása) emlékezésére szolgál, a z-puffer pedig egy külön mélységi puffer, amely a koordináták emlékezésére szolgál. z vagy az egyes látható pixelek mélysége a képtérben. Működés közben mélység vagy jelentés z minden új képpont, amelyet be kell írni a keretpufferbe, összehasonlításra kerül a már benne lévő pixel mélységével. z-puffer. Ha ez az összehasonlítás azt mutatja, hogy az új pixel a képkockapufferben található pixel előtt található, akkor az új pixel bekerül ebbe a pufferbe, és ezen felül beállításra kerül z-puffer új értékkel z. Ha az összehasonlítás ellenkező eredményt ad, akkor nem történik semmi. Az algoritmus lényegében egy keresés XÉs at legmagasabb érték funkciókat z (x, y).

Az algoritmus fő előnye az egyszerűsége. Ezenkívül ez az algoritmus megoldja a láthatatlan felületek eltávolításának problémáját, és triviálissá teszi az összetett felületek metszéspontjainak megjelenítését. A jelenetek bármilyen bonyolultságúak lehetnek. Mivel a képtér méretei rögzítettek, az algoritmus számítási bonyolultságának becslése nem több, mint lineáris. Mivel egy jelenet vagy kép elemei a keretpufferben, ill z-puffer véletlenszerű sorrendben, ezeket nem kell mélységi prioritás szerint előre rendezni. Ezért a mélységi rendezésre fordított számítási idő megtakarítható.

Az algoritmus fő hátránya a nagy memóriaigény. Ha a jelenet nézettranszformáción megy keresztül, és a koordinátaértékek rögzített tartományára van vágva z, akkor használhatod z-fix precíziós puffer. A mélységi információkat nagyobb pontossággal kell feldolgozni, mint a sík koordináta információkat (x, y); Általában 20 bit elég. A keret puffer mérete 512´512´24 bit együtt z-Az 512´512´20 bites puffer csaknem 1,5 megabájt memóriát igényel. A csökkenő memóriaárak azonban gazdaságilag indokolttá teszik a speciális tárolóeszközök létrehozását z-puffer és a kapcsolódó berendezések.



A dedikált memória létrehozásának alternatívája z-buffer a RAM felhasználása erre a célra. A szükséges memória csökkentése a képterület 4, 16 vagy több négyzetre vagy csíkra való felosztásával érhető el. Extrém esetekben használhatja z-egy letapogatási sor puffermérete. Mert utolsó eset Van egy érdekes soronkénti letapogatási algoritmus. Mivel minden jelenet elemet sokszor dolgoznak fel, szegmentálás z-buffer, általában véve a jelenet feldolgozásához szükséges idő növekedéséhez vezet. A síkbeli rendezés azonban, amely elkerüli az egyes négyzetek vagy csíkok összes sokszögének feldolgozását, jelentősen csökkentheti ezt a növekedést.

Az algoritmus másik hátránya z-puffer a lépcsőházhatás kiküszöbölésének munkaintenzitásában és magas költségében, valamint az átlátszóság és az áttetszőség hatásainak megvalósításában áll. Mivel az algoritmus véletlenszerű sorrendben helyezi el a képpontokat a framebufferben, nem könnyű megszerezni a szükséges információkat az előszűrésen alapuló lépcsőzet-ellenes technikák segítségével. Az átlátszóság és az átvilágító effektusok megvalósítása során előfordulhat, hogy a képpontok helytelen sorrendben kerülnek a keretpufferbe, ami helyi hibákhoz vezethet.

Az algoritmus formális leírása z- puffer a következő:

1. Töltse fel a framebuffert a háttér intenzitásának vagy színének értékével.

2. Töltse ki z-puffer minimális értéke z.

3. Alakítsa át az egyes sokszögeket tetszőleges sorrendben raszter alakúvá.

4. Mindenkinek Pixel(x,y) egy sokszögben, számítsa ki a mélységét z(x,y).

5. Hasonlítsa össze a mélységet z(x,y) jelentésével Zbuffer(x,y), tárolva z-puffer ugyanabban a helyzetben.

Ha z(x,y) > Zbuffer (x,y), majd írja be ennek a sokszögnek az attribútumait (intenzitás, szín stb.) a keretpufferbe, és cserélje ki Zbuffer(x,y) bekapcsolva z(x,y). Ellenkező esetben ne tegyen semmit.

A pszeudokódban az algoritmus a következőképpen ábrázolható:

minden fedett pixelhez

összehasonlítani z

Előzetes lépésként, ahol praktikus, a nem arc széleinek eltávolítását alkalmazzák.

Ha ismert az egyes sokszögeket hordozó sík egyenlete, akkor a pásztázási vonalon lévő egyes pixelek mélységének kiszámítása lépésről lépésre elvégezhető. Ebben az esetben az élt sorban (soronként) rajzoljuk meg. Megtalálni szükséges értékeket Lineáris interpolációt alkalmazunk (8.11. ábra).

(x a , y, z a)
(x 1 , y 1 , z 1 )
(x, y, z)
(x 2 , y 2 , z 2 )
(x 3 , y 3 , z 3 )
(x b , y, z b)

Rizs. 8.11. Soronkénti szkennelés

Rajzhoz y között változik y 1-től y 2-től egészen addig y 3, és minden sorra meg van határozva x a, z a, x b, z b:

xa = x 1 + (x 2 - x 1)× ;

x b = x 1 + (x 3 - x 1)× ;

z a = z 1 + (z 2 - z 1)× ;

z b = z 1 + (z 3 - z 1)× .

A szkennelési vonalon x között változik xa hogy x bés az egyenes minden pontjára meghatározzuk a mélységet z:

z = z a + (z b - z a

Az algoritmus végrehajtása a szkennelési vonal mentén lehetővé teszi az algoritmus kombinálását z-pufferek az élek raszteres szkennelésére szolgáló algoritmusokkal és az élek árnyékolására szolgáló algoritmusokkal.

Illusztráljuk az algoritmus működését az ábra példáján keresztül. 8.12.


Rizs. 8.12. Piercing háromszög

Az elején a keretpufferben és be z- a puffer nullákat tartalmaz. A téglalap raszteres beolvasása után a keretpuffer tartalma így fog kinézni

Tartalom z- puffer a következő:

Egy háromszög feldolgozása során raszteres formájúvá alakítva és mélység szerint összehasonlítva új framebuffer értéket kapunk:

Új tartalom z- a pufferek ilyenek.



Előző cikk: Következő cikk:

© 2015 .
Az oldalról | Kapcsolatok
| Webhelytérkép