OpenGL Filtrace textur
Z CHWiki
Obsah |
[editovat] Uvod
V realnem case je mozne dosahnout naprosto perfektni vizualni kvality pri libovolne zmene velikosti textury na obrazovce (frame bufferu) nebo si zvysit vykon aplikace za cenu zrnitych nebo prilis rozmazanych textur. Je treba si nejdriv uvedomit, na co ktery typ filtrovani slouzi a jakym zpusobem jej lze vylepsit, pripadne optimalizovat pro rychlost se zanedbatelnou ztratou kvality. Nasleduje seznam typu filtrovani s mipmappingem a bez, vysvetleni anisotropniho filtrovani a nejake poznatky navic.
[editovat] Bez mipmappingu
(lze pouzit pro MIN a MAG filtry)
- GL_NEAREST - Bez filtrovani. Zkratka vybere 1 nejblizsi texel a posle ho na vystup.
- GL_LINEAR - Bilinearni filtrovani, vezme 4 neblizsi texely (= pixely na texture) a zprumeruje je pomoci linearni interpolace podle polohy pixelu mezi texely. Nevyhoda: pri velkem zmenseni textury dojde k zrneni (na jednom pixelu muze byt napr. 16 texelu, ale berou se vzdy jen 4).
[editovat] S mipmappingem
(lze pouzit pouze pro MIN filter)
- Co znamenaji jednotlive filtry ve slove GL_filter1_MIPMAP_filter2?
- filter1 urcuje, jaka filtrace se provede mezi texely mipmapy
- filter2 urcuje, zda se vybere jenom jedna nejvhodnejsi mipmapa nebo se provede linearni interpolace pixelu z obou mipmap
- Vysvetleni jednotlivych typu filtrovani:
- GL_NEAREST_MIPMAP_NEAREST - Z nejvhodnejsi mipmapy vybere jeden texel, celkem hnusna kvalita. :-) V praxi se prilis nepouziva.
- GL_NEAREST_MIPMAP_LINEAR - Ze dvou nejvhodnejsich mipmap vybere 1 texel a tyto linearne interpoluje. V praxi se take prilis nepouziva.
- GL_LINEAR_MIPMAP_NEAREST - Bilinearni, z nejvhodnejsi mipmapy se vyberou 4 pixely. Stejny postup jako u GL_LINEAR, akorat se zlepsi kvalita prave kvuli mipmappingu, kdy se ze sady textur vybere vzdy takova textura, aby na dany pixel vychazely max. 4 texely. Nevyhoda: bystre oko pozna prechody mezi urovnemi mipmap.
- GL_LINEAR_MIPMAP_LINEAR - Trilinearni, krome standartni linearni interpolace mezi pixely provede jeste linearni interpolaci mezi dvema mipmapami. Temer bezchybna kvalita, pokud se na texturu divate kolmo. Bystre oko si vsimne velmi mirneho rozmazani. Nevyhoda: pokud textura ma napr. 512x512, ale na obrazovce 512x256, bude se interpolovat mipmapa o velikosti 256x256, takze bude videt rozmazani (= blur) a v pripade 512x128 uz to bude docela humus :-). Ve 3D nastava stejny pripad, pokud se na texturu divate z urciteho uhlu, nikoliv kolmo (coz je skoro vzdy). Problem vznika u bilinearniho i trilinearniho filtrovani.
[editovat] Anisotropni filtrovani
(dale AF)
- Da se pouzit jako doplnek ke vsem typum filtrovani. Muze byt 2x az 16x (nejcasteji 2,4,8,16), kde cislo znamena, kolik pixelu se bude vedle sebe v jedne ose interpolovat. Vyresi to problem u bilinearniho (at uz s mipmappingem nebo bez) a trilinearniho filtrovani pri zmene velikosti textury v jedne ose, tedy 512x512 texturu zobrazime do 512x256 na obrazovce. Pro dosazeni idealni kvality staci v tomto pripade pouzit 2x AF. Provede se zprumerovani dvou pixelu v ose Y a dosahneme presne toho, co potrebujeme: karta zjisti, ze mame 2x AF, tak vezme o jednu uroven vetsi mipmapu (misto 256x256 vezme 512x512) a zprumeruje 2 texely v ose Y, takze ve vysledku dostaneme 512x256 obrazek na obrazovce s nejlepsim filtrovanim, jakeho lze dosahnout. Pro 512x128 staci 4x AF, pro 512x64 zase 8x AF apod.
- Implementace AF neni presne dana a zalezi na vyrobci karet.
[editovat] Porovnani kvality
Filtrovani bez mipmappingu pri zmensovani zpusobuje zrneni a AF je schopno toto zrneni eliminovat az po urcite zmenseni textury. Filtrovani s mipmappingem zpusobuje rozmazani (antialiasing, v nekterych pripadech spis blur) a AF posunuje viditelnost rozmazani o X urovni mipmap (vybrana mipmapa nemusi byt ta nejvetsi podle hodnoty AF, ale takova, aby se dosahlo pozadovane kvality), napr. pri 4x AF jde videt rozmazani az pri ctyrnasobnem zmenseni, do te doby je obraz perfektni.
[editovat] Dopad na vykon
- AF je nejnarocnejsi typ filtrovani a pri vyssich hodnotach znacne snizuje fps.
- Pri 16x AF nema vypinani a zapinani mipmappingu skoro zadny vliv na kvalitu obrazu, ale po jeho zapnuti je fps zhruba 2x nizsi. Takze pokud pouzivate vysokou hodnotu AF, je lepsi mipmapping vypnout.
- Specifikace zase tvrdi, ze zapnuti mipmappingu se doporucuje k dosazeni co nejvetsi kvality.
[editovat] Zapnuti mipmappingu
glTexParameteri(target, GL_GENERATE_MIPMAP, GL_TRUE);
viz GL_SGIS_generate_mipmap (lze take pouzit knihovnu GLU, bohuzel ji nepouzivam, pisu ciste v GL)
[editovat] Zapnuti AF
glTexParameteri(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, x); // kde x je cislo v intervalu <1, 16>, 1 = vypnuto
