Bilineáris szűrés és bilineáris interpoláció
Nézze meg az alábbi képet. Ki tudod számolni az A,B és C pontokban lévő értékeket?
Létezik erre egy technika, az úgynevezett bilineáris interpoláció, amely a lineáris interpoláció ötletét két dimenzióra terjeszti ki.
A bilineáris interpoláció kiszámításához egyszerűen lineáris interpolációt végzel az egyik tengelyen, majd a másikon.
Nézd meg ezeket a példákat:
A pont
A pont koordinátája (0.2,0.8). Kezdjük az X tengellyel.
Először interpolációt végzünk a négyzet tetején az X tengelyen. Ez azt jelenti, hogy 0,2 (20%) utat kell megtennünk 7-től 0-ig. Ez a 0,2 az X tengely koordinátánk. Ennek kiszámításához így járunk el:
7 + (0-7) * 0,2 = 5,6
Ezután interpolációt végzünk a négyzet alján az X tengelyen. Tehát a fentiekhez hasonlóan 0,2 (20%) utat teszünk meg 3-tól 5-ig. Ennek kiszámításához ezt tesszük:
3 + (5-3) * 0,2 = 3,4
Most, hogy interpoláltunk az X tengelyen, interpolálnunk kell az Y tengelyen. Most az alsó értékünktől (az Y = 0 értékétől) a felső értékünkig (az Y = 1 értékéig) 0,8 (80%) fogunk eljutni. Az alsó érték az általunk elvégzett alsó interpoláció (3,4), a felső érték pedig az általunk elvégzett felső interpoláció (5,6).
Szóval, a 3,4-től az 5,6-ig tartó út 0,8 (80%) részét kell megtennünk. Ennek kiszámításához a következőt tesszük:
3,4 + (5,6 – 3,4) * 0,8 = 5,16
Az A pontban lévő érték tehát 5,16. Az alábbi kép segíthet vizuálisan elmagyarázni a folyamatot, amin keresztülmentünk.
B pont
A B pont koordinátái (1.0,0.5).
Kezdjük újra az X tengelyű interpolációval (bár könnyen kezdhetjük először az Y tengellyel, ha akarjuk! Ugyanahhoz az eredményhez jutnál).
Az X tengely interpolációját felülről végezve, 1,0 (100%) utat kell megtennünk 7-től 0-ig. Biztos vagyok benne, hogy kitalálod, mi a válasz, de itt van kiszámolva:
7 + (0-7) * 1,0 = 0
Hasonlóképpen, végezzük el az X tengely interpolációját alulról. A 3-tól 5-ig tartó út 1,0 (100%) részét kell megtennünk.
3 + (5-3) * 1,0 = 5
A következő lépés az Y tengely interpolációja. Az út 0,5 (50%) részét kell megtennünk 5-től 0-ig.
5 + (0-5) * 0,5 = 2,5
Íme, a B pont értéke 2,5. Ennek is érthetőnek kell lennie, ha megnézzük a diagramot. Ez alapvetően 1d lineáris interpoláció 5 és 0 között, és a kettő között félúton van, így intuitíve a 2,5 válasznak értelmesnek kell lennie.
C pont
A C pont koordinátája (0,8,0,2).
Még egyszer végezzük el az X tengely interpolációt a doboz tetején. A 7-ről 0,8 (80%) távolságra kell mennünk 0.
7 + (0-7) * 0,8 = 1,4
Ezután végezzük el az X tengelyes interpolációt a doboz alján. A 3-tól 5-ig tartó út 0,8 (80%) részét kell megtennünk.
3 + (5-3) * 0,8 = 4,6
Végre az y tengely interpolációja. A 4,6-tól 0,2 (20%) távolságra kell mennünk 1,4-ig.
4,6 + (1,4-4,6) * 0,2 = 3,96
A C pont értéke 3.96
Bilineáris szűrés
Míg a bilineáris interpoláció hasznos, ha van egy adatháló, amelyen belül interpolálni szeretnénk az értékeket (például egy magasságmező, amely a terepet reprezentálja?!), ahol ez igazán ragyog a játékfejlesztésben, az a bilineáris textúraszűrés.
Lényegében, ha van egy textúrakoordinátád, amely nem esik tökéletesen egybe a textúra egy pixelének középpontjával (mert van egy maradék), akkor a koordináta törtrészét használja a pixelen belül, hogy bilineáris interpolációt végezzen a 4 érintett pixel között, hogy megkapja a végső pixel színét. Bilineáris interpolációt végez minden egyes csatornán:
A végeredmény elég jó! Nézd meg az alábbi képen, hogy láthasd működés közben egy textúrán, amit túlságosan nagyítottunk. A bal oldal bilineáris szűrést használ, míg a jobb oldal nem, és csak a legközelebbi pixelt mutatja.
A bilineáris textúraszűrésnek következésképpen 4 pixeles olvasást kell végeznie, hogy interpolálni tudjon közöttük, ahelyett, hogy egyetlen pixeles olvasást végezne, mint amikor a legközelebbi pixeles mintavételt alkalmazzuk. Több pixelolvasás = több overhead, és nem olyan olcsó (számítási szempontból) a használata.
Linkek
Azoknak, akik ezt olvassák, ez az információ elég alapvető, és talán csodálkoznak, hogy miért fáradoztam azzal, hogy írjak róla. Nézzétek meg a következő hozzászólásban valami elég bizarr dolgot a bilineáris szűréssel kapcsolatban. Erre szükség volt, mint ugródeszkára a következő dologhoz, amit meg akarok mutatni nektek 😛
Wikipedia: Bilineáris interpoláció
Wikipedia: Lineáris interpoláció
Wikipedia: Bilineáris interpoláció
Wikipedia:
The Dark Side of Bilinear Filtering
Nézd meg ezeket a linkeket a hardveres bilineáris mintavételezés néhány hiányosságáról (és néhány megoldásról):
iq: hardware interpolation
iq: improved texture interpolation
Leave a Reply