2013-07-06 10 views
5

Próbując poprawić wydajność wyświetlania obiektu, który jest bardzo duży (i zapełniając ramkę GPU), po pewnych względnie lekkich obliczeniach, odkryłem, że mam możliwość kompresowania moich danych werteksów z 16-bajtowych wierzchołków do 4 bajtowe wierzchołki (ponieważ dane mogą być konceptualnie uważane za męcząco przekształconą mapę wysokości - implikującą lokalizację xi y od wierzchołka id), gdzie mogę ciasno spakować współrzędne Z na, powiedzmy, 30 bitów, pozostawiając 2 bity dla indeksu palet kolorów. Tak czy inaczej. Moje pytanie nie dotyczy pakowania współrzędnych, ale ma kolor opakowania.W którym miejscu jest bardziej efektywne użycie tekstury dla palety kolorów niż instrukcji przełącznika cieniowania?

Paleta kolorów zostanie wybrana za pomocą kodu C++ ładującego model. Ponieważ również ładuje shader, Obecnie próbuję napisać kod koloru odnośnika jako switch, a mianowicie:

int colourIndex = (compressedVertex & Mask) >> bitOffset; 
switch (colourIndex) 
{ 
case 0: return vec4(....); 
case 1: return vec4(....); 
case 2: return vec4(....); 
case 3: return vec4(....); 
} 

Jeżeli model ma więcej kolorów niż 4, jestem komfortowe poświęcania bity dokładności wysokości w celu zmieszczenia większej ilości bitów palety kolorów (aż do punktu). Moje pomiary pokazują, że użycie instrukcji switch do wiązania palety 4 kolorów nie jest wolniejsze niż wiązanie 4-pikselowych tekstur 1D i użycie samplera do odczytania z niej.

Do tej pory przeskalowałem do 32 kolorów i wydaje się, że jest to tak samo szybkie jak użycie tekstury.

Kiedy jest dobra linia w piasku, aby przestać używać przełącznika i zacząć używać tekstury do tabeli odnośników? Jeśli pomaga aplikacji, dla której się rozwijam, ma już wymuszone minimalne wymagania OpenGl 3.3. Gdy dane znajdą się na karcie, nigdy nie zostaną zmienione. Czy mogę dodać do 256 instrukcji case? 1024? 32768? Gdzie jest limit?

(Odpowiedź wyprzedzająca: Tak, mogę kontynuować eksperymentowanie i wybrać wartość, która działa dla mnie na mojej pojedynczej, nowoczesnej karcie za pomocą prób i błędów, a niektóre interpolować, ale jestem zainteresowany bardziej ogólnym pojęciem, co jest najlepsza praktyka i czy ktoś próbował czegoś podobnego i wie, że działa na wolności?)

+0

Nie ma najlepszej praktyki w tym zakresie. Chociaż sugerowałbym unikanie jawnej instrukcji switch, gdy zrobi to prosta stała tablica. Nawet 32-kolorowa macierz stała prawdopodobnie dobrze. –

+2

Jeśli kompilacja w żaden sposób nie zmieni instrukcji przełącznika na statyczną tablicę, wtedy wydajność będzie bardzo zła dla instrukcji switch i fatalna dla starszych kart (Powróci do emulacji). SIMD oznacza, że ​​tysiące punktów danych są obliczane przy użyciu tej samej instrukcji.Jeśli którykolwiek z tych punktów prowadzi do deferentnej ścieżki wykonania, wówczas cały rurociąg musi zostać przepłukany. Istnieją (rzadkie) przypadki, gdy instrukcja switch może być usprawiedliwiona: http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter17.html –

+0

Podczas gdy instrukcja switch spowoduje rozbieżne wykonanie (złe), to może nadal zrekompensować narzut na czytanie tekstury (dostęp do pamięci, wolno). Współczesne układy GPU mogą obliczyć znacznie szybciej, niż potrafią odczytać pamięć, więc instrukcja switch/if-else może być szybsza. Jako sugestię możesz umieścić tabelę odnośników w jednolitym buforze, a następnie indeksować do tego. Tabela zostanie następnie załadowana do stałej pamięci podręcznej (prawie tak szybko, jak rejestry), unikając dostępu do tekstury i rozbieżności przełącznika. – user2746401

Odpowiedz

1

Unikałem rozgałęziania się w miarę możliwości w shaderów. Moja rada polega na użyciu tekstury do wykonania wyszukiwania.

Pytasz:

mogę zatracić ją do 256 sprawozdań przypadku? 1024? 32768? Gdzie jest limit?

i mówisz:

Mam skalowane to maksymalnie 32 kolorów do tej pory, i wydaje się co najmniej tak szybko jak przy użyciu tekstury.

OpenGL rozwija się w poszukiwaniu tekstur. Jest przeznaczony do tego. Nie jest przeznaczony do gigantycznej instrukcji zmiany przełącznika. A ponieważ komentatorzy twierdzą, że nie będzie dobrze działać we wszystkich dziedzinach. Tekstura o wymiarach 64x64 pikseli może dać 4096 wyszukiwań, a na dłuższą metę będzie to szybsze w przypadku większej liczby wyszukiwań.

Powiązane problemy