13. 3. 2015

Kauza: chýbajúce anizotropné filtrovanie textúr na PS4ke


Trpezlivosť s ďalším textom, ako vždy chcem aby ste to pochopili, napíšem to primerane stručne a jednoducho. Začíname. Hypotetická obrazovka s rozlíšením 256x256 fyzických pixelov. Textúra 256x256 texelov s 1:1 mapovaním vycapená na display. Pristúpne bližšie. Textúra sa "zväčší" podobne ako stena, imp či výbušný sud v hre DOOM. Ešte väčší zoom a na ploche už máme len zopár veľkých farebných "štvorcov". Bilineárny filtering /2x lineárna interpolácia v oboch osiach/, ktorý nás masovo navštívil hlavne s prichodom prvých 3Dfx grafických kariet rieši práve tento problém. Plynulé prechody jednotlivých texelov medzi sebou. Vážený priemer, nové inter-texely, farebný gradient, prechod. Štandardná súčasť výbavy dnešných GPU, dnes prakticky nemerateľná spotreba výkonu, bez poklesu fps.


bilineárne filtrovanie ON/OF a mipmapping v Qvejk trojke vpravo

Odstúpme od tej textúry, jej veľkosť sa zmenší, povedzme na viditeľných 128x128 pixelov, rozlíšenie obrazovky ostáva bez zmeny 256x256 pixelov. Položme si teraz otázku prečo pracovať v tomto momente s 256x256 textúrou /65 535 bodov/, drancovať priepustnosť, texel fillrate plus čumieť na hrozný pixel crawling /pixel-subpixel aliasing artefakty, keď sa pôvodná textúra snaží natlačiť do stále menšieho počtu bodov obrazovky/ keď z nej vidíme 2-4-8 krát menej dát. Uložíme si teda do vram aj 128x128 variantu a už keď sme pri tom tak aj 64x64 a 32x32 verziu. Tomuto sa hovorí vytvorenie zoznamu mip-máp základnej textúry /MIP - multum in parvo - "much in little"/. Štandardná súčasť výbavy dnešných GPU, dnes prakticky nemerateľná spotreba výkonu, bez poklesu fps /uloženie množstvá mipmáp však vyžaduje kopu vram/.

Teraz položme našu textúru a jej mipmapy na zem, nech nám to ubieha pekne perspektívne do diaľky a začnime kráčať. Eh, vidíme zreteľné, ostré prechody medzi jednotlivými mipmapami, vyzerá to ako keby ste pred sebou "tlačili" za sebou položené textúry - dlaždice s rozdielným rozlíšením /viď Qvak 3 obrázok vyššie/. Riešenie - trilineárny filtering. Jednoducho si predstavte, že jednotlivé mipmapy sú akože veľké texely a hľadáte ďalšie aritmetické priemery medzi nimi. Výsledkom je monolitická textúra bez zjavných narušení integrity s plynulou stratou detailov /rozlíšenia/. Štandardná súčasť výbavy dnešných GPU, dnes prakticky nemerateľná spotreba výkonu, bez poklesu fps.

na PS4ke sa masovo vyskytuje prvý menovaný alogoritmus, druhý kvalitnejší často "záhadne" chýba

"Bilineár" aj "trilineár" sú tzv. izotropné techniky, proces úpravy pixelov je v každom smere rovnaký, ide o virtuálny štvorec, box. Bohužiaľ 3D priestor sa na pravé uhly a ideálne podmienky príliš nehraje a nás trochu mrzí aj strata detailov našej bilineárne/trilineárne filtrovanej textúrky so vzrastajúcou vzdialenosťou od nás. To by nevadilo pri 5 kilometrov vzdialenom horizonte, my však hovoríme už o 3-5 metrov, na koberci v izbe. Anizotropné filtrovanie. Ako hovorí názov - an/iso/tropic = nefiltrujúci ROVNAKO v každom smere ako vyššie uvedení bratia. A filter box nemá štvorcový tvar, skôr je to lichobežník a podobne paralelogramy. Na konci je textúra /s mipmapami/ stále plynulo bez rušivých prechodov ubiehajúca do diaľky, avšak so zachovanou high frequency /detail/ informáciou textúry. Štandardná technika dnešných GPU, variabilná spotreba výkonu a pokles fps v závislosti od vzdialenosti, do ktorej chceme ostrosť zachovať - vzorkovanie 4x, 8x,16x. Osmička je sweet spot, môžte to však dynamicky meniť podľa náročnosti scény a dostupných kapacít GPU/vram priepustnosti.

---------------------------------

Základná teória je za nami. PS4 má objektívne šikovné a moderné GPU - tak kde je ten problém ? Je v prekvapujúco vo veľmi častej absencii AF v PS4 hrách /a to dokonca aj v natívnych hrách ako The Unfinished Swan HD, ktorý paradoxne AF na PS3ke má. Situácia je o to zábavnejšie, že multiplat gamesy bežne AF na XO /oveľa slabšie GPU/ obsahujú, na PS4ke ale po ňom nie je ani stopy. Avšak TLoU: Remaster pre PS4 - až 16xAF !!. Teraz sa v tom vyznaj, tento chaos spustil na neogafe alebo beyonde3d konšpirujúce špekulácie a žiadenie si odpovedí od SONY. Aj sa im jednej dostalo priamo z úst progiša SONY ICE teamu, ktorý citujem hovorí: "PS4 GPU je bez problémov schopné až 16xAF". Nuž to vieme, prečo však chýba tam, kde ho anemické XO bez problémov dostane ? Nejde o HW chybu dizajnu, ani o nedostatok priepustnosti ram. Na PC GPU s polovičnou BW /bus bandwidth/ ako PS4 GPU v tej istej multiplat hre to AF nájdete, aspoň na úrovni 4x. Na PS4ke iba jednoduchý trilineárny filtering. Podľa mňa išlo od začiatku o problém s PS4 GNM/X API - prevod shader kódu, profilov z DirectX WinPC "vývojarského" prostredia alebo middleware, no ale hovorte to deťom.

"Having read some documents recently I'm about 95% that it's an API misuse issue (ie. not HW related)." - Fafalada /rešpektovaný a známy herný progiš, ktorý svojho času hviezdil aj na PS2ke/

Našťastie nás pred hanbou zachránili poliaci s hrou Dying Light - "However, the PS4 version suffers from a disappointing lack of anisotropic filtering, with oblique angles producing much sharper
texture work on Xbox One
". Ide o bežnú multiplat shitku, ktorá na PS4ke beží v stabilnom 1080p/30 režime avšak bez stopy po AF. Klasika. Stala sa však jedna nenápadná vec. Najnovší patch v1.50 dodatočne pridal do PS4 verzie vysoký stupeň AF, pravdepodobne až na úrovni 16x, určite 8x /nepochybujem, že DF z eg.net sa k tejto hre ešte v analýze vráti/ !! To definitívne potvrdzuje teóriu tzv. "chyby v preklade" a vyvracie bludné teórie o chybnom HW dizajne, nedostatočnej priepustnosti, obetovaní efektov pre dosiahnute FHD rozlíšenia a podobne. Ide vlastne o rovnaký problém ako v prípade zlého framerate pacingu /časovanie 30 fps hry pri 60Hz display refresh/, tiež relatívne častejšie na PS4ke. A to je všetko, pokus urobiť z komára somára nevyšiel, búrka v pohári vody, mŕtva kačica.