14. 10. 2011

Rasterizácia versus raytracing

Ako vlastne vidíme prostredie okolo nás. Nejaký svetelný zdroj vyžiari fotóny tie narazia na objekt a odrazia sa priamo do nášho oka, respektívne sa šmyknú opačným smerom, trafia inú stenu/strom/vodnú hladinu a ten ich pošle aj naším smerom, alebo sa to stane až po 10-50-100 odrazoch, alebo vôbec nie - kým nebudú pohltené, absorbované, ohnuté, rozptýlené do posledného kvanta. V závislosti od vlnovej dĺžke /modifikované objektom od ktorého sa odrazili/ to nakonic vyprodukuje more farieb, odtieňov, odlesky, textúru povrchu, "hĺbku obrazu", zakotvenie objektu v priestore. Identický proces sa snaží napodobniť aj počítačová grafika.

Celou pointou je vlastne priradiť každému pixelu na obrazovke nejakú "správnu" farbu, nič viac v tom už vlastne nie je. Pretože sa pomaly dostávame ku bodu, keď narastajúca komplexnosť scény naráža na obmedzenia tzv. klasickej tvorby grafiky, rôznych zastaralých API ako DirectX a litografie vôbec - múdre hlavy sa snažia zefektívniť celý proces. Dobre známa rasterizácia skutočne melie z posledného a barličky ako deferred rendering /DR/, tiled based DR, soft based rasterizácia na GPU/CELL je len hrou o získanie času. Dnešné úbohé PC GPU s 300w spotrebou a 1500 stream jednotkami jasne dopláca na základy tvorby grafiky položené pred 50 rokmi. Roky sa teda špekuluje, či ju efektívnejší raytracing /je v antagonistickej polohe voči rasterizácii/ - dokáže niekedy plne nahradiť.

Rasterizácia je totiž veľmi blbý spôsob farbenia pixelov a čim viac sa snažíte o zvýšenie realističnosti scény o to ste drahší a pomalší, kopu prirodzených javov nenapodobníte nikdy. Za posledných asi 10 rokov sa z tejto technológie doluje prvé aj posledné. Výsledok je hrubo podobný kombinácii raytracing+radiosita, ale za cenu iba v hre akceptovateľných - aproximácií, odhadov a rýchlych, ale povrchných riešení. S nárastom polygónovej komplexnosti navyše rasterizácia rovnako rýchlo padá na hubu. A teraz sa nebavíme o jednom milióne trojuholníkov na frame, ale o rovnej stovke, alebo tisícoch miliónov. To je zdanlivo parketa pre raytracing, ktorý je na počet polygónov na scéne výrazne menej chúlostivý. Totiž maximálne rozlíšenie LCD telky je v tejto generácii 1080p, v ďalšej bude opäť 1080p a verím, že tomu bude tak aj o 15 rokov. Komplexnosť scény /polygóny/ však bude rasť ďalej a ďalej. A to rasterizácia skutočne "nemá rada".


odraz, lom, rozptyl, tiene - raytracing je tu ako doma

Raytracing sa snaží vyrátať "farby" podobným spôsobom ako to robí sama príroda, skrze každý pixel vašej obrazovky /fixné čislo 1080p !!/ vrhne prúd simulovaných fotónov a sleduje, o čo sa zarazia, prípadne kde sa odrazia /práve tie odrazy sú tak výpočetne náročne, už pri čísle 8-10 však dosiahnete hravo akceptovateľnú presnosť/. Rasterizácia funguje opačne - každý pixel polygónu dostane farbu priradenú výpočtom shader jednotky a všetky tia farbičky letia ku pixelom vašej obrazovky. Ak teda máte hru s 10M polys per frame, pričom polygón ma dajme tomu 25-32 pixelov, musíte roztriediť doslova miliardy informácii za sekundu - čo vlastne z toho bude bordelu zobrazené. Za každým pixelom telky vlastne stojí vo fronte 1-10-100-1000 prekrývajúcich sa polygónov a každý jeden ten sráč sa snaži dostať práve tu svoju farbu do toho jedného pixelu.

Aj preto rasterizácia potrebuje pomôcky ako je Z-buffer, aby grafika vedela, ktorý polygón je v "hierarchii hĺbky" za ktorým, to však prináša svoje nároky na videopamäť, priepustnosť a ďalšiu logiku /tranzistory, ktoré tu špinavú prácu budú vykonávať/. A pozor je to asi len 1/10 z toho, čo treba zrealizovať ako zákonné minimum. Článok by to extrémne natiahlo, každopádne dokážete si asi predstaviť, že softvérových, alebo hárdverových riešení týchto problémov je na trhu celé more. Pochopitlne to vždy ide na úkor veľkého počtu tranzistorov, ktoré nemôže robiť niečo "užitočnejšie".

Power VR GPU /Dreamcast, PSV, mobily/ veľkú časť tranďákov obetuje práve na riešenie viditeľnosti polygónov, tie ktoré vy ako hráč neuvidíte, proste nezamaľuje a ignoruje ich. PS2 bola svojho času rasterizačné monštrum a hradby prerážalo hrubou silou /fillrate 2400mpix/. Dreamcast bol presný opak, a Soul Calibur na ňom aj tak vyzeral lepšie - napriek 10 krát nižšiemu fillrejtu. Rasterizácia je ako som už povedal blbá kráva. Je schopná zamachliť všetky polygóny na scéne, aj tie odvrátene, prekrývajúce sa, alebo mimo zornej plochy a potom vám ich všetky naraz pošle na tienidlo. Posledných 20 rokov od čias prvej Geforce sa preto zdokonaľujú práve postupy ako tento guľáš dát optimalizovať. Odstraňovanie nepotrebných polygónov /hidden surface removal, clipping, culling/ je alfa a omega dobrého výkonu pri použití rasterizácie. Raytracing toto nerieši, už z princípu to má zadarmo.

Nakoniec teda prídete na to, že neviete matematickým odhadom vo veľmi veľkej a zničiteľnej scéne zobraziť korektne, rýchlo a lacno - reflexie, refrakcia, absorpciu, fluorescenciu, tiene /zásadný problém pre rasterizáciu/ a podobne. Problémom číslo dva je aj to, že sami výrobcovia hárdvéru, alebo progiši sa nevedia dohodnúť čo má pred sebou jasnejšiu budúcnosť. Medzi tábormi rasterizácie a raytracingu už roky zúri rovnaká vojna ako v časoch Speccy versus C64, alebo SEGA vs Nintendo. Raytracing má samozrejme plný kufor vlastných nevýhod /dnes sú však už vcelku elegantne riešiteľné/. Žijeme vo veľmi zaujímavých časoch, keď rasterizácia zápasí so šialenou neefektivitou tvorby grafiky a všetci sa rehotajú z absurdne nenažratých PC grafík, a na strane druhej raytracing ešte nedosiahol ten sweet point použiteľnosti. Jedna lastovička pochopiteľne leto neurobí - PowerVR RTX.

Raytracing /RT/ vlastne nie je až tak náročný na hárdver, to len dnešné grafické GPGPU karty sú plne optimalizované na rasterizáciu. Je to ako napchať cement, vodu a štrk do fiat 500ky, skotúľať ju dole kopcom a tváriť sa, že sme vynašli miešačku /RT na dnešnom PC/. Samozrejme to chce úplne zreorganizovať nielen existujúci design grafických systémov. Jednoznačným benefitom však bude jasné zníženie nákladov na tvorbu hry. Raytracing tvorí grafiku v štýle fire and forget. Môžte pochopiteľne strácať more času a teda peniazov ladením vášho shader kódu, dobrým príklad je kvalita povrchov a nasvietenia pri GT5 a Flopze. Nech to už dopadne akokoľvek, riešením dnešnej stagnácie určite nie sú 600w SLI GPU kraviny od Nvidie. A mimochodom - usilovne sa hľadá náhrada aj za polygón. Nové, lepšie, flexibilnejšie grafické primitívum.