Dinamikus mozaik táj


Ez a cikk a statikus és dinamikus módszerek alapján tessallation szintű dokkoló módszerek foltok különböző részletességgel és vágási algoritmus láthatatlan tapasz. E cikk olvasása előtt ajánlatos elolvasni a cikket a hardver mozaik és az elmozdulás feltérképezése.








Az egyes fejezetekben a cikk használták shader, válthat a példák F1..F6 kulcsokat. vagy kulcs 1..8 (k) használatára üzemmódot váltani - be van kapcsolva, hogy a következő és az előző üzemmódban volt. Mint egy további jellemzője, megnézheti a normál és a szint mozaik felhasználhatja ezt a gombot C. N. T. M - megjeleníti a textúra színes, normál szintje, mozaik és vegyes üzemmód: a szín és a szint mozaik. R gomb segítségével állítsa be a mai shader, P között vált rács térkép és sokszögek.
Azokban az esetekben, ahol a változás részlet megmarad a következő gombokat:
- és + megváltoztatja a maximális mozaik,
<и> Megváltoztatja a részletesség szintjét,
[És] megváltoztatja a magassága a terep.
Ahhoz, hogy egy használt W. S. A. A. billentyűk mozogni függőlegesen - Shift. Tér.
A címsor megjeleníti a kiválasztott része a például a megfelelő része a cikket, a keretek száma másodpercenként, a számát származó és generált csúcsok.


Itt, mint más példán mesh méretű 128x128 csúcsok használt háromszög vagy négyzet foltok (attól függően, hogy a példa). Szögletes tapaszok kevesebb helyet foglalnak el -, hogy egyetlen folt 4-6, az index a háromszög alakú folt.
Mielőtt teszi a háló méretét a javítás telepítve van:

Alapértelmezett tapasz mérete 3. Ha nem állítja be a megfelelő méretet a javítás, mint az ellátási 3, ha a shader definiáljuk 4, a hiba nem fordul elő, de fel kell hívni helytelenül.
Ahhoz, hogy elkerüljük az ilyen hibákat, akkor kap az értéke javításokat a shader funkció glGetProgramiv a GL_TESS_CONTROL_OUTPUT_VERTICES paramétert. visszaad egy értéket meghatározni kontroll shader a sorban:

Az értékelés shader olvasható a kártya és a normális magasság, a pozíció felé tolódott el a magassága a magasság térkép, és a rendes vezetjük a töredék shader, ami lehet kiszámítani világítás.

Ez a példa egy egységes mozaik négyzet tapaszok tessallation szinten rögzítették a maximális érték, ami nagyban csökkenti a teljesítményt. A sleduyuscheih alkatrészek ismertetjük optimalizálása megjelenítési minőségét megőrzése.


Ahhoz, hogy a felület minősége a kívánt partíciót használja a változó részletességgel, de van egy probléma - a szomszédos foltok lehetnek különböző részletesség eredményező hiányosságok között kapunk. Ezért megfelelő dokkoló tapaszok különböző részletességgel használt gl_TessLevelOuter paramétert.
A példában, az egyes csúcs a vertex shader kap egy véletlen érték mozaik szintkapcsolásra
Módok 1. és 2. billentyűvel lehet engedélyezni és letiltani a megfelelő dokkoló. Az eredmény nem megfelelő kapcsolatok:

Dinamikus mozaik táj

A képen látható a többszörös közötti rések tapaszok különböző részletességgel.

A vezérlés határozza meg a szintet mozaik shader határán a tapasz a megfelelő dokkoló szükséges, hogy ezek a szintek egybeesnek. Ezt úgy kapjuk, hogy elvégezzük a funkciója ugyanaz szintjének kiszámítása mozaik shader minden, a példákban olyan funkció max:

Használhatja bármilyen számítási funkció, amelynek eredményei lesznek az azonos élek egybeesnek.


Háromszög javításokat.
Háromoldalú tapaszok csak három értéke gl_TessLevelOuter.
Nulla index gl_TessLevelOuter befolyásolja vertex index 1 és 2, az első - 0 és 2, a második - a 0 és 1.
például:

Szögletes javításokat.
Szögletes foltok használja mind a négy értékeit gl_TessLevelOuter.
Nulla index gl_TessLevelOuter Viliia csúcsú index 0 és 3, az első - 0 és 1, a második - az 1. és 2., a harmadik - a 2. és 3..
például:

Gl_TessLevelInner érték bármi lehet - ezek nem befolyásolják a helyes dokkoló,
de egységes tessallation kívánatos, hogy a maximális vagy átlagos szintje
tessallation bordák (gl_TessLevelOuter), például:


Érdemes megjegyezni, hogy a nullák bejegyzések gl_TessLevelInner és gl_TessLevelOuter folt jön létre,
Ez a tulajdonság lehet használni, hogy vágja le a tapaszt, hanem meg kell győződnie arról, hogy
metszés nem történik véletlenül, így a példa egy bilincs funkció:

unMaxTessLevel - a maximális tessallation határozza meg az alkalmazást.








Ez a példa egy előre generált struktúra részletességét minden csúcsa. Tárolására részletességgel elég lenne textúra méret R8 felbontás 128x128 (egy texeit a tetején).

A kódrészlet shader gen_normal_and_tesslvl.prg két funkciója van:
ReadHeight - szól textúrát egy 4x4 mátrix, ez használ 4 textureGatherOffsets hívja funkciót.
GenTessLevel - generáló funkció részletesen szinten számított magassági pont között két lépésben függőlegesen és vízszintesen, az eredmény normalizált és tárolják a textúra.

A mozaik shader adunk az olvasási részletességgel a vertex shader.

Dinamikus mozaik táj

Mint látható a képen, ahol a magasság nagyobb fokú mozaik is nagyobb (piros - a legnagyobb részletességgel), lehetséges, hogy csökkentse a poligonok számát több mint 2 alkalommal. Distant hulladéklerakók túlságosan magas szinten részletezett probléma kijavításához használja a következő módszert.


A legtöbb szükséges részleteket a kamera közelében, és a távolabb a kamera, a kevésbé részletes, ebben a példában alkalmazott lineáris változás detelizatsii távolság a kamera.
A részletesség szintje a csúcs a vertex shader kiszámítani, mert ez a funkció Szint:

unDetailLevel - a részletesség szintjét.
ker - távolság a kamera és a felső, akkor a következőképpen kell kiszámítani:


Ahhoz, hogy megfelelően kiszámítja a távolságot kell mozgatni a vertex a megadott érték a magasság térképet a felszíni normals belenyúlnak helyet a képernyőn. Akkor számított távolság a csúcs. Mivel a kamera mindig a központban koordináták, a vektor hosszát ismeri eléggé.
Ezek mind változások történtek a program minden nagyon egyszerű, és a poligonok számát csökkent több mint 10 alkalommal.

Dinamikus mozaik táj


Az előző példában, a távoli hulladéklerakók nincs elegendő részletességgel, különösen érezhető a nagy tartományok, a részletesség szintjét változások technikát, attól függően, hogy a méret a sokszög a képernyőn megoldja ezt a problémát.
A vertex shader adunk fordítására a legjobb pozíció a helyet a képernyőn:


A shader kontroll tessallation szinten számítani minden él:

Level függvény részletesség szintjét, attól függően, hogy a méret a bordák:

unDetailLevel - a részletességgel jelentése a bejelentésben megadott, mint az előző példában. értéke
Ez túl nagy, így a hányados 0,01 használják.


Ennek a megközelítésnek számos hátránya van:
1. Ha a változások részletezve foltok egyszerre - villog, részben
korrigálható a nagy részletességgel a másik típusú a partíció:


2. Amikor húzza poligon éle is nagyban méretben.
Ennek eredményeként, vannak területek alacsony részleteket.
Annak érdekében, hogy ne okozzon problémát kapcsolat foltok, lehetetlen, hogy növelje a részleteket a bordák -
a szomszédos foltok nem lesz információt róla. A megoldás erre a problémára is azzal a korábbi technika.

Dinamikus mozaik táj


Ebben a példában, hozzátéve nyírás láthatatlan tapasz két dinamikus módon részlet számítás. Változások a velük azonos, így az üzlet csak egy példa. 1 és 2 gomb használják közötti váltáshoz a példákban.
A vertex shader hozzáadott funkció, hogy ellenőrizze a felső találatot a képernyőn:

mérete - meghatározza a mérete a képernyő, ez nem egy állandó - terjedhet 1.0 és így tovább.
Minél nagyobb a paraméter, annál sokszögek szélén a képernyőn látható lesz, beleértve azokat is,
amelyek nem pontosan esnek a képernyőn. A 1,0 érték adja a legjobb cut-off és a szegények pontosság - a széleit
gyakran levágja a felesleges. Az érték 1.2 ad jó pontossággal és minimális írásvetítő. Megtekintheti, hogy nyírás foltok történik, akkor meg a mérete kisebb, mint 1, az eredmény értéke 0,7 pakazan a screenshot:

Dinamikus mozaik táj

A vizsgálati eredmény és a képernyő koordinátáit vertex shader továbbítani a szabályozás:


Úgy tűnik, hogy tudta, hogy az összes csúcsot a tapasz a képernyőre könnyen vágható le a tapaszt,
de ez nem az. Sok esetben nincs gond, de ha a tetején a tapasz nem tartalmazza
A területet a képernyőn, és a sokszög még mindig látható, akkor további vizsgálatok lesz szükség.

Dinamikus mozaik táj

Az ellenőrzés meglehetősen egyszerű - ellenőrizze tapasz átkelés a képernyő képernyő koordináták:

Téglalap függvény AABB a tapasz csúcsok állandó mérete megegyezik a InScreen funkciót. Ez egy algoritmus téglalapok kereszteződés teszt.

Nos, akkor ez egyszerű:

Ha a tapasz nem látható, akkor k nullára van állítva, és megszorozva a szint mozaik
Kiderült is nulla, ennek eredményeként a tapasz van vágva tessellator.

A screenshotok össze tudja hasonlítani a két számítási módszerek dinamikus mozaik használt szögletes foltok és a korai z-selejtezés javításokat, így értékeli a részleteket kapcsolatos számú kimeneti primitívek:

Dinamikus mozaik táj

Dinamikus mozaik táj


A különböző esetekben lehet megközelíteni a különböző technikák itt tárgyalt, de a hatékonyabb lesz a keveréke két vagy három technikát. Például, a technikák használatára együtt a távolság növekvő belső válaszfal tapasz (gl_TessLevelInner) méretétől függően a képernyő.

Végezetül szeretném megköszönni Cyril Bazhenov (aka bazhenovc) a segítséget példákkal és cikkeket.




Kapcsolódó cikkek