Wydajność grafiki wektorowej w porównaniu do grafiki bitmapowej lub rastrowej

20

Czasami używam grafiki wektorowej, po prostu dlatego, że w niektórych przypadkach wyglądają nieco ładniej, a innym razem używam grafiki bitmapowej / rastrowej.

Zastanawiałem się, czy istnieją jakieś znaczące różnice w wydajności między tymi dwiema opcjami?

Ethan Bierlein
źródło
6
Naprawdę zależy to od wielu czynników. NVIDIA zapewnia przyspieszenie sprzętowe grafiki wektorowej. Widziałeś to? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Odpowiedzi:

15

Jak powiedział TheBuzzSaw, zależy to od wielu rzeczy, w tym od implementacji grafiki rastrowej w porównaniu do grafiki wektorowej.

Oto kilka metod grafiki wektorowej o wysokiej wydajności, które są renderowane przy użyciu tradycyjnych metod rasteryzacji.

Loop i Blinn pokazują, jak renderować kwadratową krzywą beziera grafiki wektorowej, renderując pojedynczy trójkąt i używając współrzędnych tekstury w module cieniującym piksele, aby stwierdzić, czy piksel znajduje się powyżej czy poniżej krzywej: http: //www.msr-waypoint. net / en-us / um / people / cloop / LoopBlinn05.pdf

Podstawową ideą jest ustawienie trójkątnych pozycji narożnych na 3 pozycje punktu kontrolnego i ustawienie współrzędnych tekstury w każdym narożniku odpowiednio na (0,0), (0,5,0) i (1,1). W module cieniującym, jeśli interpolowana współrzędna tekstury (x * xy) wynosi <0, piksel znajduje się pod krzywą, w przeciwnym razie jest powyżej krzywej.

Możesz zobaczyć fałszywą implementację tego na shadertoy tutaj: https://www.shadertoy.com/view/4tj3Dy

Jeśli chodzi o drugą metodę, oto metoda z Valve, w której odległości do kształtu są przechowywane w teksturze zamiast danych pikselowych, umożliwiając rysowanie grafiki wektorowej za pomocą próbkowania tekstury. Dekodowanie jest tak proste, że można je zaimplementować nawet na sprzęcie o stałej funkcji za pomocą tylko testu alfa! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Aby dać ci wyobrażenie o tym, jak dobrze działa druga technika, ten wąsy 1024 x 768 został wygenerowany z obrazu źródłowego 64 x 32, który miał jeden kanał kolorów! (aka nieskompresowany 2 KB)

wprowadź opis zdjęcia tutaj

Napisałem też o tym na swoim blogu: http://blog.demofox.org/2014/06/30/distance-field-textures/

Oto przykładowy kod OpenCL, który pokazuje, jakie to proste:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Obie te techniki są super szybkie i nieco zacierają granicę między grafiką wektorową i rasteryzowaną. Są renderowane przy użyciu technik rasteryzacji, ale mają właściwości powiększania / skalowania, takie jak techniki grafiki wektorowej.

Alan Wolfe
źródło
1
Zobacz także wentoftware.com/publications/2007/...
internety są wykonane z catz
tak, to bardzo fajna technika, to druga technika, o której wspomniałem, i link do tego samego pliku pdf również powyżej.
Alan Wolfe,
Woops, przegapiłem, przepraszam.
internety są wykonane z catz
1
Adaptacyjne rozwiązanie do krawędziowego wygładzania pól odległości można znaleźć tutaj: essentialmath.com/blog/?p=151 .
Jim Van Verth,
8

Może tam być.

Mniej odpowiedzi technicznej:

Jeśli budujesz stronę internetową lub inną aplikację, w której nie masz nic wspólnego z programowaniem graficznym, odpowiedź brzmi prawdopodobnie tak. Podstawowe interfejsy API spróbują zgadnąć, jak je renderować i skutecznie buforować. Ponieważ jednak aplikacja działa, a interfejs API czasami zgaduje niepoprawnie, może być konieczne ponowne renderowanie elementów i obniżenie wydajności.

Więcej technicznych:

Pamiętaj, że jeśli nie używasz jednego z najnowszych układów GPU i biblioteki do rysowania ścieżek wektorowych na GPU, wszystkie tekstury bitmapowe są renderowane przez GPU.

Rozważę typowy przypadek, w którym grafiki wektorowe są renderowane do tekstur. Wydajność zależy od łańcucha narzędzi, od tego, czy aplikacja dynamicznie tworzy tekstury z zasobów wektora i czy grafika jest wyświetlana przy różnych poziomach powiększenia. W grę wchodzą dwa problemy: generowanie zasobów i tekstur. Jeśli wyświetlasz grafikę tylko w rozmiarze statycznym, powiedziałbym, że nie ma różnicy i być może twój zestaw narzędzi może przekształcić zasoby w grafikę bitmapową przed uruchomieniem. Jeśli jednak są wyświetlane w różnych rozmiarach lub w świecie 3D, będziesz potrzebować tekstur zmapowanych, które zajmują więcej pamięci. Zajmą dużo pamięci, jeśli naprawdę chcesz zobaczyć ich wierność z bliska o większej fakturze.

Mam nadzieję, że to pomoże.

ShaneC
źródło
6

Istnieje kilka sposobów renderowania grafiki wektorowej. Jak wspomina TheBuzzSaw, NVIDIA ma rozszerzenie, które może dość szybko renderować ogólne ścieżki (ale oczywiście działa tylko na GPU NVIDIA). Alan Wolfe wspomina o niejawnych metodach powierzchniowych (Loop-Blinn / pola odległości), które definiują funkcję, która mówi, czy jesteś wewnątrz kształtu, czy poza nim, i kolorują piksele na podstawie tej funkcji. Inną metodą są szablony i okładki, w których renderujesz ścieżkę w buforze szablonów i używasz parzystej liczby nieparzystej, aby ustalić, czy ścieżka obejmuje piksel.

Ogólnie jednak kompromis polega na tym, że renderowanie rastra będzie szybsze, ale jest bardziej podatne na aliasing (nawet pola odległości rozpadają się w niskiej i wysokiej skali). Ścieżki renderowania wymagają wielu ustawień, ale teoretycznie można je skalować do dowolnej rozdzielczości.

Jim Van Verth
źródło