Door Tomas Hochstenbach

Redacteur

Zo werkt een videokaart

Diepe duik in de moderne graphicspipeline

24-07-2021 • 06:00

138

Singlepage-opmaak

Filtering en anti-aliasing

Als je regelmatig te vinden bent in het instellingenmenu van je favoriete game, ben je ongetwijfeld de termen filtering en anti-aliasing tegengekomen. In veel games kun je van beide functies de hoeveelheid instellen, vaak uitgedrukt in 'aantal keer'. Beide technieken zijn oplossingen voor fundamentele problemen bij het renderen van een 3d-wereld op een 2d-monitor.

Filtering

Het probleem dat filtering tracht te verhelpen, is dat texels (de pixels van een texture) lang niet altijd overeenkomen met de pixels van je monitor. Textures zijn bovendien 2d-afbeeldingen, terwijl objecten in de virtuele wereld driedimensionaal zijn. Zoals we op de pagina over rasterization al bespraken, moet er worden geïnterpoleerd tussen texels om te bepalen welke kleur een pixel moet krijgen. Alleen zo kan een texture op realistische wijze op een 3d-object worden 'geplakt'.

Filtering is de naam voor dat bijrekenen. De basaalste vorm hiervan was van oudsher bilinear filtering, waarbij de vier pixels rondom een texel werden geïnterpoleerd als benadering van een 'cirkel' om de texel heen. Dat werkt prima als je in een game recht op het object met de texture kijkt, maar wordt problematisch als het object onder een hoek is geplaatst ten opzichte van de camerapositie, de vloer bijvoorbeeld. Als je een cirkel onder een hoek bekijkt, wordt het immers een ellips, waardoor de interpolatie op basis van een cirkelvorm niet langer het gewenste resultaat oplevert. Vooral objecten dieper in de 3d-scène worden op basis van traditionele filtering al gauw wazig.

Projectie cirkel wordt ellips in 3D-wereld
Als je een cirkel onder een hoek bekijkt, wordt het een ellips en volstaat bilinear filtering niet meer.
High quality elliptical texture filtering on GPU, P. Mavridis en G. Papaioannou, 2011 via Researchgate

In moderne games wordt daarom anisotropic filtering toegepast. Isotroop betekent dat de eigenschappen van een materiaal in alle richtingen gelijk zijn; dat is hierbij dus niet het geval. Eerst wordt namelijk de ellipsvorm berekend die door de kijkhoek gerechtvaardigd wordt, waardoor de toegepaste filtering per richting verschillend wordt. Zo kan ook een object dat relatief ver van de camerapositie is verwijderd, met scherpe textures worden ingevuld.

Anisotropic filtering
Anisotropic filtering houdt ook textures die dieper in de scène zijn geplaatst scherp.
Cobblestones door THOMAS onder CC BY-SA 3.0

Het 'aantal keer' dat je instelt in je gamesettings, betreft overigens de mate van anisotropie, oftewel hoe groot de hoek ten opzichte van het camerastandpunt moet zijn voordat er niet langer filtering wordt toegepast. In de praktijk zijn textures onder een grote hoek, en vaak ook dieper in de scène, vaak slecht zichtbaar. Daardoor is het voor het complete plaatje niet de moeite waard om álles te filteren.

Anti-aliasing

Het tweede fundamentele probleem van een naar pixels gerenderd beeld is aliasing. Dit effect wordt veroorzaakt doordat de pixels op je monitor relatief grote vierkanten zijn, waarbij elk vierkant uitsluitend de kleur van het midden van die pixel heeft. Een horizontale of verticale lijn van een pixel breed weergeven is daardoor eenvoudig, maar een schuine lijn kan alleen bestaan uit blokjes die op een gegeven moment een kolom verspringen. Dit neem je waar als een kartelrand, bijvoorbeeld bij de rand van een object.

De oplossing voor aliasing is in de basis simpel; render het beeld groter dan het uiteindelijk moet worden, en verklein het daarna weer naar de bedoelde resolutie. Dit wordt supersampling of full-scene anti-aliasing genoemd. Op de hogere resolutie bevat de schuine lijn meer detail dan op de standaardresolutie het geval is, simpelweg omdat er meer rijen en kolommen pixels zijn. Bij het verkleinen wordt van vier pixels telkens één pixel gemaakt door de kleuren van de bronpixels te mengen. Hierdoor heeft het resultaat meer detail en kleurverloop in de rand tussen de schuine lijn en de achtergrond, wat de kartelrand wegpoetst.

Anti-aliasing
Een lijn zonder (boven) en met anti-aliasing. Rechtsboven op honderd procent, onder ingezoomd zodat je duidelijk ziet wat er gebeurt.

Hetzelfde geldt overigens voor details die normaliter te klein zijn voor een pixel, zoals een grasspriet. Die zouden normaal verloren gaan, maar als de groene spriet het wel tot een van de vier subpixels schopt, kan hij toch terugkomen in het eindresultaat.

Het volledig supersamplen van het beeld zou bijvoorbeeld betekenen dat je op 4k-resolutie moet renderen om een full-hd-beeld uit te sturen naar je monitor. We hoeven je waarschijnlijk niet uit te leggen dat dat een enorm prestatieverlies zou geven. In de loop der tijd zijn er daarom tal van algoritmes ontwikkeld om anti-aliasing efficiënter te maken.

MSAA, FXAA en TAA

Tegenwoordig is multisample-anti-aliasing oftewel MSAA de meestgebruikte techniek. Hierbij wordt eerst gekeken of een pixel wel bestaat uit meer dan één driehoek. Dat is bij het grootste deel van de pixels niet het geval, waardoor er ook geen zichtbare aliasing kan optreden. Deze pixels worden zodoende op reguliere wijze gerenderd. Alleen als een pixel zich op de rand tussen verschillende driehoeken bevindt, en er dus storende aliasing kan ontstaan, worden er meer subpixels berekend om die later weer te mengen tot één pixel. Het resultaat is in principe hetzelfde als wanneer supersampling zou zijn toegepast.

Alternatieven voor MSAA zijn onder andere het snelle, maar minder nauwkeurige FXAA, dat randen van objecten probeert te herkennen en af te vlakken, en TAA, dat op basis van het huidige beeld en een aantal voorgaande frames de beeldkwaliteit probeert te verbeteren. Per beeld wordt maar één subpixel gerenderd, maar in elk frame wordt die iets verschoven. Als het beeld stilstaat, is de kwaliteit vergelijkbaar met MSAA, maar bij snelle bewegingen kan er ghosting ontstaan.

Ook voor anti-aliasing kun je vaak een ratio instellen, bijvoorbeeld 2x, 4x of 8x. In dit geval bepaalt de ratio hoe veel subpixels gebruikt worden voor het mengen. Een hogere ratio levert dus een hogere kwaliteit op, maar kost ook meer rekenkracht.

Upscaling met DLSS of FSR

Bij de RTX 2000-serie introduceerde Nvidia DLSS. Met behulp van de Tensor-cores en specifieke machinelearning wordt het beeld op een slimme manier opgeschaald. Het principe is gebaseerd op TAA, maar voor het detecteren van beweging wordt deep learning gebruikt, waardoor de achilleshiel van traditionele TAA wordt getackeld.

Het doel van DLSS is echter niet om het frame vervolgens terug te schalen naar de renderresolutie, maar om de upscaling te behouden en zo prestatiewinst te boeken ten opzichte van renderen op de native resolutie van je monitor. AMD's FSR, dat sinds 22 juni eindelijk beschikbaar is, heeft een soortgelijk doel, maar gebruikt daarvoor uitsluitend het huidige frame. Voor beide technieken geldt overigens dat een gameontwikkelaar er bewust ondersteuning voor moet inbouwen.