Czym właściwie są piksele?
Zwykle kiedy mówimy o pikselach mamy na myśli małe kwadraty. Oglądany w bardzo dużym przybliżeniu cyfrowy obraz albo ekran wyglądają w przybliżeniu właśnie jak płaszczyzna szczelnie wypełniona małymi kwadratami. Jednak w grafice trójwymiarowej tak nie jest, i bez tej informacji nie zrozumiemy wielu problemów związanych z renderowaniem.
W grafice trójwymiarowej piksele są punktami, bliskimi matematycznej definicji punktu. Nie mają wymiaru ani powierzchni.
Trójkąty również są abstrakcją matematyczną. Nie mają żadnej rozdzielczości ani nie składają się z pikseli – te pojęcia nie mają do nich zastosowania. Żeby je wyświetlić na ekranie, trzeba wybrać jakieś miejsca, a potem sprawdzić, czy te miejsca powinny być zajęte przez wizerunek trójkąta:
Ta operacja to rasteryzacja: przekształcanie czegoś ciągłego na skończoną liczbę punktów.
Kiedy już wiadomo, jaki obiekt jest pod każdym punktem, trzeba policzyć kolor każdego z tych punktów. Obliczanie koloru to cieniowanie – shading. Program obliczający kolor to shader; dla każdego punktu trzeba wykonać ten program od nowa.
Policzonym kolorem można wypełnić kwadratowe piksele ekranu:
Miejsca próbkowania są symbolicznie przedstawione na środku pikseli, ale w rzeczywistości nie ma to znaczenia: po prostu jeden punkt jest przypisany do jednego piksela.
W ten sposób z bezwymiarowych abstrakcyjnych kształtów powstaje obraz złożony ze skończonej liczby wypełniających powierzchnię kwadratów:
W najprostszym i najczęściej spotykanym sposobie renderowania punktów jest tyle samo, co pikseli ekranu, na którym chcemy wyświetlać obraz. Każdy piksel powstaje z połączenia dwóch informacji: pokrycia (wypełnienia), które określa, który obiekt jest widoczny w tym miejscu, oraz koloru.
Wygładzanie krawędzi i multipróbkowanie
Próbki pokrycia służą do odtworzenia kształtu obiektu, który ma zostać wyświetlony. Jeśli chcemy odtworzyć kształt przedmiotu dokładniej, trzeba wziąć pod uwagę więcej próbek pokrycia. Na tym polegają najskuteczniejsze techniki wygładzania krawędzi: geometria sceny jest obliczana w większej liczbie miejsc, niż liczba pikseli w docelowym obrazie.
Najstarsza technika wygładzania krawędzi – supersampling (SSAA)– polegała na sprawdzaniu i pokrycia, i koloru w kilku punktach, z których wyniki składały się na jeden piksel obrazu. Na przykład SSAA ×4 wymaga obliczenia pokrycia i koloru cztery razy dla każdego piksela obrazu, który chcemy uzyskać. To nieznacznie różni się od renderowania w dwukrotnie wyższej rozdzielczości. Tę technikę możecie pamiętać np. z Wiedźmina 2, gdzie nazywała się Ubersampling.
Przez długie lata standardem w grach pecetowych była technika MSAA, w której kolor obliczany jest w jednym miejscu, a pokrycie – w kilku. MSAA ×4 sprawdza geometrię w 4 miejscach, a kolor – w jednym.
Pikselowi obrazu nadaje się kolor proporcjonalnie do policzonego w jednym miejscu koloru i liczbie próbek pokrycia, które „trafiły” w obiekt o tym kolorze. W tym przypadku wszystkie próbki koloru dały ten sam wynik. W zależności od liczby próbek pokrycia, które „trafiły” w zielony trójkąt wynikowe piksele są mniej lub bardziej zielone. Na przykład pierwszy od lewej piksel jest w 1/4 pokryty kolorem trójkąta, a ten odpowiadający górnemu wierzchołkowi – w 3/4:
Wygładzanie krawędzi MSAA ×2, ×8 czy ×16 ma tyle samo próbek koloru, ale więcej próbek pokrycia.
We współczesnych grach popularne są postprodukcyjne techniki wygładzania krawędzi, które nie wykorzystują żadnych dodatkowych informacji o geometrii – operują na obrazie już „spłaszczonym” i poddanym rasteryzacji. Niektóre (MLAA, SMAA) próbują „domyślić” się, gdzie dokładnie przebiegają krawędzie. Inne polegają na próbkowaniu w różnych miejscach w kolejnych klatkach, i wykorzystywaniu informacji z poprzednich klatek.
Techniki wygładzania krawędzi można sklasyfikować w ten sposób:
na jeden piksel przypada: | |||
---|---|---|---|
próbki pokrycia | próbki koloru | próbki pochodzą z | |
natywna rozdzielczość bez wygładzania krawędzi | 1 | 1 | – |
SSAA (supersampling) | 2 lub więcej | tyle samo, co próbek pokrycia | różnych miejsc |
MSAA | 2 lub więcej | 1 | różnych miejsc |
FXAA, MLAA, SMAA | 1 | 1 | – |
TAA | 2 lub więcej | 1 lub więcej | różnych klatek |
przeplot szachownicowy (checkerboard rendering) | 1 | 1 | różnych klatek |
skalowanie rozdzielczości | mniej niż 1 | mniej niż 1 | – |
Nvidia DLSS (rekonstrukcja przez SI) | mniej niż 1 | mniej niż 1 | – |
VRS zgrubne cieniowanie | 1 | mniej niż 1 | różnych miejsc |
Jedna aktualna próbka pokrycia i jedna próbka koloru na jeden piksel ekranu to pewien punkt odniesienia w jakości obrazu. Jeśli próbek jest mniej, jakość jest zwykle gorsza. Jeśli jest ich więcej, jakość jest zwykle lepsza. Jeśli próbki pochodzą z różnych klatek – tak jak w TAA albo przeplocie szachownicowym z rekonstrukcją temporalną – to nieruchomy obraz może być tak dobry, jak to wynika z liczby próbek składających się na jeden piksel, ale ruchomy obraz jest niższej jakości i obarczony artefaktami.
Skalowanie rozdzielczości oraz Nvidia DLSS służą do powiększania obrazu i pobierają z najnowszej klatki obrazu mniej informacji, niż renderowanie w natywnej rozdzielczości – żeby rywalizować jakością z natywną rozdzielczością lub ją przewyższyć muszą zostać połączone z jakimś rodzajem rekonstrukcji temporalnej, który daje te dodatkowe informacje.
Znając informacje, jakimi dysponują poszczególne techniki, można spróbować domyślić się, jaka jest ich skuteczność. Najlepsze odwzorowanie geometrii, w tym odwzorowanie subpikselowych detali (czyli takich, które są mniejsze, niż odstęp między środkami pikseli) zapewniają tylko te techniki, które mają dodatkowe informacje o geometrii. Z obrazu już poddanego rasteryzacji nie da się odzyskać subpikselowych detali: potrzebne są informacje pozyskane z obecnej klatki (dodatkowe próbki pokrycia) albo przeniesione z poprzednich klatek, w których zostały pozyskane w innym miejscu. W technikach temporalnych (TAA, przeplot szachownicowy) sprawdza się pokrycie i kolor pikseli mniej razy w jednej klatce niż w SSAA, ale w każdej kolejnej klatce w innym miejscu. Informacje z poprzednich klatek są podawane dalej. W ten sposób jeśli jakiś obiekt był widoczny w poprzedniej klatce, to w obecnej jest o nim więcej informacji, niż wynika z liczby próbek na klatkę.
Zgrubne cieniowanie
Zgrubne cieniowanie (coarse rate shading) jest w pewnym sensie odwrotnością lub rozszerzeniem wygładzania krawędzi MSAA w przeciwnym kierunku. Zamiast próbkować geometrię częściej niż co jeden piksel, można próbkować kolor rzadziej niż co jeden piksel.
Rasteryzacja jest przeprowadzana z pełną rozdzielczością: jedna próbka pokrycia na jeden piksel ekranu. Odwzorowanie krawędzi i niewielkich obiektów jest tak samo dobre, jak w renderowaniu z natywną rozdzielczością. Jednak kolor jest obliczany rzadziej – na przykład tylko jeden raz dla czterech sąsiadujących pikseli:
Próbki koloru są obliczane tylko raz na cztery piksele, a ich kolor rozprzestrzeniany na wszystkie piksele, w których próbka pokrycia „trafiła” w obiekt:
Pokazana powyżej 1 próbka koloru na 4 piksele ekranu to tylko przykład. W nowoczesnych GPU i API przewidziano różne rozdzielczości cieniowania. Dla każdej możemy sobie wyobrazić „dokładne” piksele odpowiadające rozdzielczości ekranu oraz „zgrubne” piksele odpowiadające najmniejszej części ekranu, która może mieć unikalny kolor. Te „zgrubne” piksele mogą być 2 razy większe, 4 razy większe, 8 razy większe lub 16 razy większe:
Variable Rate Shading
Variable w nazwie tej techniki oznacza, że rozdzielczość cieniowania zmienia się w ramach jednej klatki. Można to zrobić na różne sposoby: za pomocą mapy ekranu lub osobno dla każdego polecenia rysowania (draw call).
W trybie mapy ekranu tworzy się teksturę-maskę, która służy do określenia, który segment ekranu ma być cieniowany z jaką rozdzielczością. Segmenty mogą mieć rozmiar 8×8, 16×16 lub 32×32 piksele. Wewnątrz takiego kwadratu wszystkie obiekty będą cieniowane z wybraną rozdzielczością. Te metodę wykorzystano w Wolfenstein II: The New Colossus (więcej informacji na następnej stronie).
Żeby najlepiej wykorzystać VRS w trybie mapy ekranu, trzeba dodać do tej techniki jakiś czynnik temporalny. Nie można ocenić, która część obecnej klatki jest ważna i pełna szczegółów, dopóki nie wygenerujemy jej go końca. Można za to założyć, że poprzednia klatka była dość podobna, i zaczerpnąć tę informację z poprzedniej klatki. Można też wykorzystać informacje o położeniu obiektów z poprzedniej klatki – te, które znacząco zmieniły pozycję szybko się poruszają, więc mogą być cieniowane ze zmniejszoną dokładnością. Informacje o ruchu są zwykle dostępne „za darmo”, bo mapa wektorów ruchu jest i tak obliczana na potrzeby efektu rozmycia (motion blur).
Rozdzielczość cieniowania można też ustawić oddzielnie dla każdego polecenia rysowania. Draw call – polecenie rysowania – zwykle odpowiada jednej bryle geometrycznej pokrytej jedną teksturą. Jeden złożony model może wymagać wielu poleceń rysowania, ale proste bryły i efekty (a nawet kilka prostych, identycznych obiektów) mogą odpowiadać jednemu poleceniu.
Ustawianie zgrubnego cieniowania osobno dla każdej bryły lub draw call może być niezależne od jakichkolwiek dodatkowych informacji i nie wymaga podawania dalej czegokolwiek z poprzedniej klatki. Może też dawać znacznie lepszą jakość obrazu i większy zysk wydajności, ale wymaga dostosowania do konkretnej gry lub silnika graficznego. Jakość cieniowania można dostosować do:
- treści obrazu – mało szczegółowe tekstury lub takie, które mają niewielki wkład w końcowy obraz (np. maski efektów postprodukcyjnych) można oznaczyć jako nadające się do zgrubnego cieniowania
- efektów rozmycia, odbić, załamań – jeśli obraz jakiegoś obiektu będzie i tak mocno zniekształcony np. przez głębię ostrości, można go cieniować z niską rozdzielczością
- istotności obiektu – jeśli reżyser pewnej sceny wie, że wzrok obserwatora będzie skierowany na pewne istotne elementy sceny, może mniej ważne elementy przygotować do cieniowania z niską rozdzielczością
To wymaga pewnej wiedzy i zaangażowania nie tylko od programistów, ale i od artystów, ale pozwala najlepiej uniknąć zbyt zgrubnego cieniowania istotnych, rzucających się w oczy elementów lub zbyt dokładnego cieniowania czegoś, co i tak pozostanie niezauważone. Pomagające w tym mechanizmy powinny być wbudowane w narzędzia do pracy z silnikiem graficznym. Na przykład Unreal Engine 4 umożliwia manipulowanie rozdzielczością cieniowania w zależności od nałożonej na obiekt tekstury.
Ile można zyskać na VRS?
Największego zysku wydajności należy się spodziewać tam, gdzie cieniowanie jest stosunkowo największą częścią generowania obrazu:
- Im wyższa rozdzielczość, tym wyższy zysk: w wyższych rozdzielczościach jest do wykonania tyle samo obliczeń niezwiązanych z cieniowaniem, ale więcej cieniowania.
- Im słabszy układ graficzny, tym większy zysk: mało wydajne układy graficzne muszą sobie poradzić z tak samo złożoną geometrią, jak wydajne osobne karty graficzne, ale są zwykle projektowane z myślą o niższej rozdzielczości. Przez to częściej mają niedobór mocy obliczeniowej do przeznaczenia na cieniowanie.
- Im bardziej złożone cieniowanie, tym większy zysk: gry i sceny z dużą liczbą skomplikowanych efektów, przezroczystości, rozmyć, ale ze stosunkowo mało złożoną geometrią zyskają najwięcej na uniknięciu cieniowania.
- Im mniej obiektów i im mniej skomplikowane one są, tym większy zysk: w złożonych scenach z dużą liczbą draw calli płynność jest zwykle w większym stopniu ograniczona wydajnością procesora, a więc odjęcie pracy GPU da mniejszy efekt.
- Im mniejsza przepustowość pamięci GPU, tym większy zysk: mniej cieniowania oznacza sprawdzanie koloru tekstury w pamięci mniej razy.
VRS nie jest jeszcze szeroko wykorzystywana w grach, ale możemy wnioskować na podstawie kilku przykładów.
W Wolfenstein II: The New Colossus wykorzystano VRS w trybie mapy ekranu. Rozdzielczość cieniowania jest wybierana dla regionów o rozmiarze 16×16 pikseli na podstawie informacji z poprzedniej klatki („co było kontrastowe i istotne w poprzedniej klatce?”) oraz wektorów ruchu („co się szybko porusza, a więc zostanie poddane rozmyciu?”). Wolfenstein II wykorzystuje specjalne rozszerzenie API Vulkan, dostępne wyłącznie na kartach Nvidia Turing, i obniża rozdzielczość cieniowania najdalej do 1/8 (2×4 lub 4×2). Jak wykazały przeprowadzone przez nas testy, zastosowanie najbardziej agresywnego trybu pozwala zwiększyć płynność na high-endowych kartach graficznych o najwyżej 9%. Utrata jakości obrazu jest niemal niezauważalna – algorytm zmniejsza rozdzielczość cieniowania bardzo zachowawczo, a utracone detale zostają zwykle ukryte przez rozmycie lub odzyskane przez TAA.
Twórcy nadchodzącej gry Chivalry II (Unreal Engine 4) używają w swojej grze VRS w trybie mapy ekranu. Jak donoszą, wykorzystanie VRS pozwala poprawić wydajność na zintegrowanym układzie graficznym w procesorze Ice Lake o maksymalnie 32%, ale z łatwo zauważalną utratą jakości. Ponieważ to dynamiczna gra wieloosobowa, zachowanie wysokiej płynności oraz rozdzielczości krawędzi i rozpoznawalności kształtów zostały uznane za ważniejsze, niż wysoka jakość cieniowania wewnątrz powierzchni.
W eksperymentalnej wersji gry Cywilizacja VI twórcy uzyskali ok. 14% wyższą płynność na GeForce RTX 2060 w rozdzielczości 4K w trybie mapy ekranu oraz o ok. 20% lepszą płynność ustawiając rozdzielczość cieniowania osobno dla każdego obiektu.
W 3DMarku można wykonać test wydajności VRS, zarówno w trybie mapy ekranu jak i w trybie „po jednym poleceniu”. Zaprezentowane tam sceny są bardzo proste, a wzrost wydajności dzięki włączeniu VRS przedstawia bardzo optymistyczny scenariusz.
Najważniejsze, co możemy z niego wynieść, to potwierdzenie zależności od rozdzielczości. Im wyższa rozdzielczość, tym większą korzyść daje ograniczenie cieniowania.
Obraz powiększony dwukrotnie.
W czym nie pomaga VRS
Zgrubne cieniowanie pozwala oszczędzić obliczeń tylko na jednym z etapów powstawania obrazu. Nie ma żadnego istotnego wpływu na obciążenie procesora, bo symulacja świata gry, interakcje z użytkownikiem, komunikacja z serwerem gry sieciowej, ani wydawanie poleceń rysowania nie stają się prostsze dzięki VRS. Te technika nie pozwala też na żadną dużą oszczędność pamięci potrzebnej do wygenerowania obrazu. Oczywiście rzadsze cieniowanie oznacza mniej informacji wynikowych do przechowania, ale różne już poddane rasteryzacji powierzchnie są małą cześcią tego, co trzeba zmieścić w pamięci GPU.
Potencjalne problemy
VRS nie zawsze jest łatwym i skutecznym rozwiązaniem. Po pierwsze, może powodować powstawanie artefaktów nie związanych bezpośrednio z tak zwaną „pikselozą”. Jeśli częstotliwość kontrastowych elementów na teksturze jest bliska częstotliwości próbkowania koloru, mogą pojawić się typowe artefakty związane z aliasingiem: migotanie i utrata małych detali, tym razem nie na krawędziach, ale wewnątrz obiektów. Dlatego mipmapy (wstępnie zmniejszone wersje tekstur wykorzystywane, kiedy nie jest potrzebny pełen rozmiar) muszą być przygotowane z myślą o VRS. Również krawędzie wewnątrz tekstur z przezroczystością mogą stać się niedokładne, ponieważ nie są interpretowane jako krawędź bryły, ale ciągła powierzchnia.
Po drugie, zgrubne cieniowanie może kłócić się z założeniami, dzięki którym skutecznie działają różne techniki postprodukcyjne, np. temporalny antyaliasing (TAA), postprodukcyjne odbicia (screen space reflections) czy ambient occlusion.
Po trzecie, zbyt gorliwe zmienianie rozdzielczości cieniowania może nawet zmniejszyć wydajność i wydłużyć proces renderowania jednej klatki. Procesory graficzne są doskonale przystosowane do wykonywania wiele razy tego samego programu na dużym zbiorze danych. Cieniowanie wielu pikseli w ten sam sposób pozwala zająć całą szerokość bloku SIMD oraz wykorzystać w efektywny sposób pamięć podręczną oraz bezstratną kompresję danych w pamięciach podręcznych i pamięci GPU. Zmniejszenie liczby jednakowo cieniowanych pikseli poniżej pewnego progu może dać najwyżej jakąś oszczędność energii, ale nie skrócenie obliczeń. Na dodatek przygotowanie poleceń rysowania z różnymi rozdzielczościami cieniowania daje procesorowi nieco dodatkowej pracy.
VRS w nowych procesorach graficznych i nowych API
Zgrubne cieniowanie można zrealizować sposobami programowymi. Inżynierowie Intela eksperymentowali ze zgrubnym cieniowaniem za pomocą MSAA i specjalnych shaderów w 2014 roku, używając API DirectX 11 i układów graficznych Gen8 (Haswell, Broadwell). VRS daje najlepsze efekty i wymaga najmniejszych zmian programistycznych, jeśli jest wspomagane sprzętowo i dostępne za pośrednictwem jednego z nowych interfejsów programistycznych (API).
VRS jest jedną z funkcji sprzętowych dostępnych za pośrednictwem DirectX 12. Urządzenie kompatybilne z API DirectX 12 może przedstawiać się jako zgodne z:
- VRS, poziom 1 – zgrubne cieniowanie poszczególnych draw calli – każde polecenie rysowania ma określoną rozdzielczość cieniowania.
- VRS, poziom 2 – zgrubne cieniowanie w trybie mapy ekranu, dla każdego polecenia rysowania lub dla każdej bryły osobno – te tryby mogą być łączone.
Oba poziomy wymagają tylko zgrubnego cieniowania o połowie (1×2 lub 2×1) i jednej czwartej (2×2) rozdzielczości. Dodatkowe opcjonalne funkcje DirectX 12 określają, czy GPU obsługuje jeszcze mniejsze rozdzielczości cieniowania: jeden raz na osiem (2×4 lub 4x2) albo na szesnaście (4×4) pikseli.
Najbardziej uniwersalną i najbogatszą funkcjonalność VRS oferują procesory graficzne Nvidia Turing. VRS można na nich wykorzystać w DirectX 12 za pomocą uniwersalnego, nie przywiązanego do żadnego producenta GPU rozszerzenia, a w DirectX 11, OpenGL i Vulkan – za pomocą NVAPI i działających tylko na GPU Nvidii rozszerzeń API.
VRS określone osobno dla każdego polecenia rysowania obsługują również układy graficzne Intel Gen11, czyli te wbudowane w procesory Ice Lake. Są zgodne z VRS poziomu 1 i obsługują wszystkie zmniejszone rozdzielczości cieniowania od 1×1 do 4×4.
Nadchodzące procesory graficzne i API
Oczekujemy, że wszystkie nadchodzące architektury pecetowych układów graficznych będą obsługiwały VRS poziomu 2:
- AMD RDNA2 – oczekiwane wsparcie w ramach DirectX 12
- Intel Xe – oczekiwane wsparcie w ramach DirectX 12
- Xbox Series X – oczekiwane wsparcie
- PlayStation 5 – oczekiwane wsparcie
Oczywiście wsparcie VRS w nowych konsolach będzie możliwe za pośrednictwem właściwych dla nich API.
Pozostałą niewiadomą jest dodanie VRS do standardu Vulkan. Najnowsza wersja – Vulkan 1.2 – zawiera tylko zaproponowane przez Nvidię rozszerzenia VRS, działające wyłącznie na sprzęcie Nvidii. Spodziewamy się, że tak samo jak rozszerzenia związane ze śledzeniem promieni (VK_KHR_ray_tracing) zostaną one „awansowane” do rangi standardu i zaadaptowane na potrzeby wszystkich producentów GPU. Przykład DirectX pozwala sądzić, że jest już pewien konsensus pomiędzy producentami GPU i twórcami oprogramowania, i pozostały już tylko przeszkody proceduralne.
Przyszłość oszczędnego cieniowania
Sądzimy, że zgrubne cieniowanie jest eleganckim i wszechstronnym rozwiązaniem, które z czasem stanie się równie powszechne, co wygładzanie krawędzi. Ponieważ potencjalne korzyści są umiarkowane, popularyzacja tej techniki zajmie zapewne sporo czasu. Zgrubne cieniowanie będzie w przypadku wielu gier konieczne, żeby osiągnąć wymaganą płynność na konsolach nadchodzącej generacji – Xbox Series X oraz PlayStation 5. Twórcy gier powinni dość szybko się z nim oswoić.
W graniu pecetowym należy oczekiwać umiarkowanych zysków. Zademonstrowane do tej pory implementacje VRS pozwalają polepszyć płynność o ok. kilka-kilkanaście procent. W Wolfenstein II: The New Colossus wydajne desktopowe karty graficzne zyskują mniej niż 10%; w najbardziej sprzyjających warunkach to ok. 30%.
Sądzimy, że zgrubne cieniowanie będzie najkorzystniejsze dla zintegrowanych GPU i konsol. Użytkownicy jednych i drugich do tej pory nie wymagali najwyższej jakości grafiki i byli skłonni zgodzić się na rozdzielczość mniejszą niż natywna rozdzielczość ekranu. VRS może pozwolić na zwiększenie rozdzielczości do natywnej i zrezygnowanie z kiepskich technik skalowania rozdzielczości (rozciąganie z wyostrzaniem). VRS można stosunkowo łatwo i z korzyścią połączyć z różnymi rodzajami wygładzania krawędzi albo rekonstrukcji temporalnej. Ta technika może działać i przynosić wymierne korzyści na sprzęcie z całego spektrum wydajności. Jednocześnie nie wymaga znaczącego zwiększenia nakładu pracy na przygotowanie treści gry. To wszystko powinno przyspieszyć jej zaadaptowanie – na przeszkodzie stoi tylko to, że stosunkowo niewiele z już wykorzystywanych GPU obsługuje VRS. Laptopy z Ice Lake upowszechniają się powoli, a ich układy graficzne obsługują VRS tylko w trybie mapy ekranu. Obecne układy graficzne AMD (również te wbudowane w laptopowe Ryzeny 4000) nie obsługują VRS, a high-endowe karty graficzne Nvidii najmniej potrzebują przyspieszenia, jakie może dać VRS. Popularyzacja VRS zapewne ruszy z kopyta dopiero po debiucie nowych konsol – te bez wątpienia szybciej zdobędą znaczący udział w rynku, niż jakiekolwiek nadchodzące wbudowane układy graficzne.
VRS może też mieć świetlaną przyszłość w urządzeniach przenośnych, na przykład smartfonach. Gęstość pikseli na ekranach smartfonów jest bardzo duża. Ząbkowane krawędzie są bardzo łatwo zauważalne dla użytkownika przyzwyczajonego do perfekcyjnie wyrenderowanych ekranów interfejsu użytkownika, ale zmniejszona rozdzielczość cieniowania może pozostać niezauważona. VRS jest też idealnym środkiem na zaoszczędzenie przepustowości pamięci i oszczędzenie energii, co jest niezwykle ważne w smartfonach. Na razie jednak nie wiadomo, kiedy ARM, Imagination Technologies, Qualcomm czy Apple zamierzają umożliwić sprzętowe przyspieszanie VRS.
Dalszy ciąg
W drugiej części tego artykułu opowiemy o pokrewnych sposobach na renderowanie nie więcej, niż potrzeba, a więc o:
- rasteryzacji z mniejszą rozdzielczością
- renderowaniu dopasowanym do uwagi obserwatora
- renderowaniu dopasowanym do kształtu ekranu
- zastosowaniach tych technik w wirtualnej rzeczywistości
Przy okazji powiemy o cechach ludzkich oczu i zmysłu wzroku, które wpływają na techniki renderowania.