TakéRasterisation, scan conversion, převod do rastruPokročilý

Definice

Rasterizace je převod geometrie, písma, vektorových tvarů nebo obrazových popisů na mřížku pixelů či vzorků. V grafických kartách tvoří klíčový krok mezi 3D scénou a obrazem na displeji: rozhoduje, které pixely pokrývá trojúhelník, jakou mají hloubku a jaké fragmenty dostanou shadery.

Kategorie: Grafické programováníAktualizováno

Nezaměňujte: Rasterizace se používá v počítačové grafice, GIS, typografii i tisku; základní princip převodu do rastru je podobný, ale liší se vstupní data a přesnostní požadavky.

Rasterizace v grafickém řetězci

Rasterizace sedí mezi popisem scény a hotovým rastrovým obrazem. Aplikace obvykle pošle grafické kartě vrcholy trojúhelníků, jejich souřadnice, materiály a stav vykreslovacího řetězce. Po transformacích a ořezu následuje krok, který určí, jaké vzorky obrazové mřížky daná geometrie zasáhne. Teprve potom může grafická karta počítat barvu fragmentů, testovat hloubku a zapisovat výsledek do framebufferu.

Proces je záměrně lokální a datově paralelní. Každý trojúhelník se dá rozdělit na mnoho kandidátních fragmentů, které mohou běžet současně na tisících výpočetních jednotek GPU. Právě tato vlastnost vysvětluje, proč rasterizace dlouho dominuje hrám, rozhraním a interaktivním 3D aplikacím: reakce musí přijít v milisekundách, i když scéna obsahuje velké množství objektů.

Od trojúhelníku k pokrytým pixelům

Hrana trojúhelníku se při rasterizaci porovnává s pravidly pokrytí. Implementace musí rozhodnout, zda střed pixelu nebo více vzorků v pixelu leží uvnitř primitiva. Současně se interpolují hodnoty z vrcholů, například texturační souřadnice, normála, barva nebo hloubka. Interpolace musí brát v úvahu perspektivu, jinak by se textura na šikmé ploše viditelně deformovala.

Rasterizační výstup se často označuje jako fragment, nikoli rovnou pixel. Fragment je kandidát na zápis do obrazu. Fragment může být později zahozen hloubkovým testem, stencil testem, průhledností nebo shaderem. Jeden pixel navíc může mít více vzorků při multisamplingu, takže vztah mezi fragmentem, vzorkem a výsledným pixelem není vždy jedna ku jedné.

Hloubka, ořez a zubaté hrany

Hloubkový buffer řeší viditelnost bez nutnosti seřadit všechny objekty ve scéně. Každý fragment přináší hloubkovou hodnotu a grafická karta ji porovná s hodnotou uloženou na dané pozici. Bližší fragment obvykle vyhraje, vzdálenější se zahodí. Průhledné materiály tento jednoduchý model komplikují, protože výsledek závisí na pořadí míchání barev.

Rasterizace převádí spojité tvary na konečnou mřížku, takže vzniká aliasing. Šikmé hrany mohou vypadat jako schody, tenké čáry mohou mizet a vzdálené textury mohou blikat. Antialiasing, mipmapy a filtrování textur tyto artefakty zmírňují, ale neodstraňují samotnou povahu vzorkování.

Kde rasterizace naráží na limity

Rasterizace exceluje, když lze scénu rozložit na primitiva viděná kamerou. Globální světelné jevy se však nepočítají přirozeně: odrazy, měkké stíny, lom světla nebo nepřímé osvětlení často vyžadují triky, předpočítaná data nebo kombinaci s ray tracingem. Vývojář pak volí kompromis mezi rychlostí, pamětí, stabilitou obrazu a věrohodností.

Ray tracing sleduje paprsky scénou a lépe modeluje některé optické jevy, ale bývá výpočetně dražší. Moderní enginy proto často kombinují rasterizaci pro hlavní geometrii s paprskovými nebo obrazovými metodami pro vybrané efekty. U textu, ikon a map má rasterizace jiný důraz: důležitá je ostrost při konkrétním rozlišení, správné zarovnání na pixelovou mřížku a čitelnost po škálování.

Příklady z praxe

  1. Trojúhelník ve WebGL

    WebGL aplikace pošle do GPU tři vrcholy trojúhelníku a zavolá vykreslení. Rasterizace určí, které obrazové vzorky leží uvnitř trojúhelníku, a pro každý kandidátní fragment spustí navazující práci shaderů. Výsledek se objeví ve framebufferu jako vyplněná plocha, ne jako tři samostatné body.

    gl.bindBuffer(gl.ARRAY_BUFFER, triangleBuffer);
    gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
    gl.drawArrays(gl.TRIANGLES, 0, 3);
  2. Polygon v mapové vrstvě

    Kartografický nástroj převede polygon lesní oblasti na rastrovou masku s buňkami po deseti metrech. Buňky uvnitř polygonu dostanou hodnotu 1, ostatní hodnotu 0, takže další výpočet snadno spočítá překryv se sklonem terénu nebo pokrytím signálem. Jemnější mřížka dá přesnější hranici, ale zvětší soubor i dobu zpracování.

Časté omyly

MýtusRasterizace je jen uložení obrázku do PNG nebo JPEG.
Ve skutečnostiRasterizace je obecnější převod tvarů, geometrie nebo písma na rastrovou mřížku. Uložení do PNG nebo JPEG je až kódování výsledných pixelových dat do souborového formátu.
MýtusRasterizace automaticky znamená horší kvalitu než vektorová grafika.
Ve skutečnostiRasterizace ztrácí nezávislost na rozlišení, ale kvalita závisí na rozlišení, vzorkování a filtrování. Pro displej je rastrový výstup nakonec nutný, protože obrazovka sama pracuje s obrazovými body.

Časté dotazy

Proč rasterizace dominuje v hrách a interaktivní grafice?
Rasterizace dominuje v interaktivní grafice, protože dobře odpovídá hardwaru GPU. Scéna se rozdělí na trojúhelníky a velké množství fragmentů, které lze počítat paralelně. Hry a vizualizace potřebují stabilní snímkovou frekvenci, takže rychlost často vítězí nad fyzikálně přesným modelem světla. Fotorealistické efekty se potom doplňují shadery, texturami, screen-space technikami nebo částečným ray tracingem.
Co znamená fragment při rasterizaci?
Fragment při rasterizaci je kandidát na příspěvek do výsledného obrazu. Fragment obvykle nese pozici, hloubku a interpolované hodnoty z vrcholů, například texturační souřadnice nebo barvu. Fragment ještě nemusí skončit jako pixel: hloubkový test, stencil test, průhlednost nebo shader jej mohou změnit nebo zahodit. Při multisamplingu může jeden pixel souviset s více vzorky a fragmenty.
Kdy rasterizace nestačí pro fotorealistický obraz?
Rasterizace nestačí sama o sobě tam, kde výsledek výrazně závisí na cestě světla scénou. Zrcadlové odrazy mimo obraz, lom ve skle, měkké kontaktní stíny nebo nepřímé osvětlení se rasterizací počítají nepřímo a často pomocí aproximací. Hybridní renderery proto používají rasterizaci pro rychlé vykreslení hlavní scény a ray tracing pro vybrané světelné jevy.
Ovlivňuje rasterizace ostrost textu a ikon?
Rasterizace výrazně ovlivňuje ostrost textu a ikon, protože vektorový tvar se musí promítnout do konkrétní pixelové mřížky. Malé písmo může ztratit detaily, když hrany vycházejí mezi pixely nebo když se použije nevhodné vyhlazování. Renderovací systémy proto používají hinting, subpixelové vykreslování, antialiasing nebo bitmapové varianty pro určité velikosti.

Zdroje

  1. Rasterisation(otevře se v novém okně)Wikipedia
  2. Rasterization(otevře se v novém okně)Khronos Group
  3. Rasterizer Stage(otevře se v novém okně)Microsoft
  4. WebGL API(otevře se v novém okně)MDN Web Docs

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.