Renderowanie kafelkowe - Tiled rendering
Renderowanie kafelkowe to proces dzielenia obrazu grafiki komputerowej przez regularną siatkę w przestrzeni optycznej i renderowania każdej sekcji siatki lub kafelka osobno. Zaletą tego projektu jest zmniejszenie ilości pamięci i przepustowości w porównaniu z systemami renderowania w trybie natychmiastowym , które rysują całą klatkę jednocześnie. To sprawiło, że systemy renderowania kafelków są szczególnie popularne w przypadku urządzeń przenośnych o niskim poborze mocy . Renderowanie kafelkowe jest czasami nazywane architekturą „sortowania środka”, ponieważ sortuje geometrię w środku potoku graficznego, a nie blisko jego końca.
Podstawowy pomysł
Tworzenie obrazu 3D do wyświetlenia składa się z szeregu kroków. Najpierw obiekty do wyświetlenia są ładowane do pamięci z poszczególnych modeli . Następnie system stosuje funkcje matematyczne w celu przekształcenia modeli we wspólny układ współrzędnych, światopogląd . Z tego punktu widzenia tworzona jest seria wielokątów (zwykle trójkątów), które przybliżają oryginalne modele widziane z określonego punktu widzenia, kamery . Następnie system komponowania tworzy obraz, renderując trójkąty i nakładając tekstury na zewnątrz. Tekstury to małe obrazy namalowane na trójkątach w celu uzyskania realizmu. Powstały obraz jest następnie łączony z różnymi efektami specjalnymi i przenoszony do bufora ramki , który następnie skanuje sprzęt wideo w celu uzyskania wyświetlanego obrazu. Ten podstawowy układ koncepcyjny jest znany jako potok wyświetlania .
Każdy z tych kroków zwiększa ilość pamięci potrzebnej do przechowywania wynikowego obrazu. Zanim dotrze do końca potoku, obrazy są tak duże, że typowe projekty kart graficznych często wykorzystują wyspecjalizowaną szybką pamięć i bardzo szybką magistralę komputerową, aby zapewnić wymaganą przepustowość do przenoszenia obrazu do i z różnych podrzędnych elementy rurociągu. Ten rodzaj wsparcia jest możliwy na dedykowanych kartach graficznych, ale ponieważ budżety mocy i rozmiarów stają się coraz bardziej ograniczone, zapewnienie wystarczającej przepustowości staje się kosztowne pod względem projektowym.
Renderery kafelkowe rozwiązują ten problem, dzieląc obraz na sekcje zwane kafelkami i renderując każdą z nich osobno. Zmniejsza to ilość pamięci potrzebnej podczas etapów pośrednich oraz ilość danych przenoszonych w dowolnym momencie. W tym celu system sortuje trójkąty tworzące geometrię według lokalizacji, co pozwala szybko znaleźć, które trójkąty nakładają się na granice kafelków. Następnie ładuje tylko te trójkąty do potoku renderowania, wykonuje różne operacje renderowania w GPU i wysyła wynik do bufora ramki . Można używać bardzo małych kafelków, 16×16 i 32×32 piksele są popularnymi rozmiarami kafelków, co sprawia, że ilość pamięci i przepustowość wymagana również na etapach wewnętrznych jest niewielka. A ponieważ każda płytka jest niezależna, naturalnie nadaje się do prostej równoległości.
W typowym rendererze kafelkowym geometrię należy najpierw przekształcić w obszar ekranu i przypisać do kafelków obszaru ekranu. Wymaga to trochę miejsca na listy geometrii dla każdego kafelka. We wczesnych systemach kafelkowych było to wykonywane przez procesor , ale cały nowoczesny sprzęt zawiera sprzęt, który przyspiesza ten krok. Listę geometrii można również posortować od przodu do tyłu, dzięki czemu GPU może użyć usuwania ukrytych powierzchni, aby uniknąć przetwarzania pikseli, które są ukryte za innymi, oszczędzając przepustowość pamięci na niepotrzebne wyszukiwanie tekstur.
Istnieją dwie główne wady podejścia kafelkowego. Jednym z nich jest to, że niektóre trójkąty mogą być narysowane kilka razy, jeśli nakładają się na kilka płytek. Oznacza to, że całkowity czas renderowania byłby wyższy niż w systemie renderowania w trybie natychmiastowym. Możliwe są również problemy, gdy płytki trzeba zszyć, aby uzyskać pełny obraz, ale ten problem został rozwiązany dawno temu. Trudniejsze do rozwiązania jest to, że niektóre techniki obrazowania są stosowane do klatki jako całości, a te są trudne do zaimplementowania w renderowaniu kafelkowym, gdzie nie chodzi o to, aby pracować z całą ramką. Te kompromisy są dobrze znane i mają niewielkie konsekwencje dla systemów, w których zalety są przydatne; kafelkowe systemy renderowania są powszechnie stosowane w przenośnych urządzeniach komputerowych.
Renderowania kafelkowego nie należy mylić ze schematami adresowania kafelkowego/nieliniowego bufora ramki , które powodują, że sąsiadujące piksele również sąsiadują w pamięci. Te schematy adresowania są używane przez wiele różnych architektur, a nie tylko renderujące kafelki.
Wczesna praca
Wiele wczesnych prac nad renderowaniem kafelkowym wykonano w ramach architektury Pixel Planes 5 (1989).
Projekt Pixel Planes 5 zweryfikował podejście kafelkowe i wymyślił wiele technik obecnie postrzeganych jako standardowe dla rendererów kafelkowych. Jest to praca najczęściej cytowana przez inne publikacje z tej dziedziny.
Podejście kafelkowe było również znane na początku historii renderowania oprogramowania. Implementacje renderowania Reyesa często dzielą obraz na „wiadra kafelkowe”.
Produkty komercyjne — komputery stacjonarne i konsole
Na początku opracowywania procesorów graficznych do komputerów stacjonarnych kilka firm opracowało architektury kafelkowe. Z biegiem czasu zostały one w dużej mierze wyparte przez procesory graficzne działające w trybie natychmiastowym z szybkimi niestandardowymi systemami pamięci zewnętrznej.
Główne przykłady tego to:
- Architektura renderowania PowerVR (1996): Rasteryzator składał się z kafelka 32×32, w którym wielokąty zostały zrasteryzowane na obrazie w wielu pikselach równolegle. We wczesnych wersjach PC kafelkowanie odbywało się w sterowniku graficznym działającym na procesorze . W aplikacji na konsolę Dreamcast kafelkowanie zostało wykonane przez kawałek sprzętu. Ułatwiło to odroczone renderowanie — tylko widoczne piksele zostały zmapowane jako tekstury , co zaoszczędziło obliczenia cieniowania i przepustowość tekstur .
- Talizman Microsoftu (1996)
- Dreamcast (zasilany chipsetem PowerVR) (1998)
- Gigapikselowy GP-1 (1999)
- Procesor graficzny Intel Larrabee (2009) (anulowany)
- PS Vita (zasilany chipsetem PowerVR) (2011)
- Procesory graficzne Nvidia oparte na architekturze Maxwell i późniejszych architekturach (2014)
- Procesory graficzne AMD oparte na architekturze Vega (GCN5) i nowszych architekturach (2017)
- Procesor graficzny Intel Gen11 i nowsze architektury (2019)
Przykłady architektur niekafelkowych, które używają dużych buforów na chipie, to:
- Xbox 360 (2005): GPU zawiera wbudowaną pamięć eDRAM o pojemności 10 MB ; to nie wystarczy, aby utrzymać raster dla całego obrazu 1280×720 z 4- krotnym wielopróbkowym antyaliasingiem , więc rozwiązanie kafelkowania jest nakładane podczas pracy w rozdzielczościach HD i włączony jest 4× MSAA.
- Xbox One (2013): GPU zawiera wbudowaną 32 MB pamięci eSRAM , która może być używana do przechowywania całości lub części obrazu. Nie jest to architektura kafelkowa, ale jest na tyle elastyczna, że programiści mogą emulować renderowanie kafelkowe.
Produkty komercyjne – Embedded
Ze względu na stosunkowo niską przepustowość pamięci zewnętrznej i niewielką ilość wymaganej pamięci na chipie, renderowanie kafelkowe jest popularną technologią dla wbudowanych procesorów graficznych. Aktualne przykłady obejmują:
Renderowanie w trybie natychmiastowym w oparciu o kafelki (TBIM):
- Seria ARM Mali .
- Qualcomm Adreno (seria 300 i nowsze mogą również dynamicznie przełączać się na renderowanie w trybie natychmiastowym/bezpośrednim za pośrednictwem FlexRender).
Odroczone renderowanie oparte na kafelkach (TBDR):
- Seria Arm Mali .
- Technologie wyobraźni Seria PowerVR 5/6/7.
- Seria Broadcom VideoCore IV .
- Krzemowe procesory graficzne firmy Apple .
Vivante produkuje mobilne procesory graficzne, które mają ściśle powiązaną pamięć bufora klatek (podobnie do opisanego powyżej GPU Xbox 360). Chociaż można to wykorzystać do renderowania części ekranu, duży rozmiar renderowanych regionów oznacza, że zwykle nie są one opisywane jako korzystające z architektury opartej na kafelkach.