2013-04-21 7 views
16

Konceptualizuję dobre podejście do renderowania wielu rozłącznych elementów geometrii za pomocą pojedynczego wywołania w OpenGL, a ściana, na którą jestem przeciw, jest najlepszym sposobem, aby to zrobić, gdy każdy element ma inne tłumaczenie, a może obrót , ponieważ nie masz luksusu aktualizowania jednolitego widoku modelu między pojedynczymi obiektami. Czytałem kilka innych pytań tutaj i gdzie indziej i wygląda na to, że wskazówki, na które ludzie są wskazywani, są dość zróżnicowane. Byłoby miło wymienić główne metody robienia tego i próbować wyizolować to, co jest najbardziej powszechne lub zalecane. Oto pomysły mam rozważane:Co to jest najlepsza praktyka w przypadku obiektów rysowania wsadowego z różnymi przekształceniami?

[edit: usunięto wzmianki o Instancing gdyż tak naprawdę nie ma tutaj zastosowania]

  1. Tworzenie macierzy przekształceń w cieniującego. Tutaj wysłałbym wektor translacji lub może kąt obrotu lub kwaternion jako część atrybutów. Zaletą jest to, że będzie działać na różnych platformach, w tym na urządzeniach mobilnych. Ale wydaje się nieco marnotrawstwem wysłanie takich samych danych transformacji dla każdego pojedynczego wierzchołka w obiekcie, jako atrybutu. Bez instancji, musiałbym powtarzać te identyczne wektory lub skalary dla pojedynczego obiektu wiele razy w VBO jako część tablicy przeplatania, prawda? Inną wadą jest to, że polegam na shaderze, aby wykonać matematykę; Nie wiem, czy to mądre, czy nie.

  2. Podobny do 1), ale zamiast polegać na module cieniującym, aby wykonać obliczenia macierzy, zamiast tego wykonuję je po stronie klienta, ale nadal wysyłam przez ostateczną macierz widoku modelu jako strumień 16 zmiennych w VBO. Ale o ile mogę powiedzieć, bez instancji, musiałbym powtórzyć ten identyczny strumień dla każdego pojedynczego wierzchołka w VBO, prawda? Wydaje się tylko marnotrawstwem. Kompromis z 2) powyżej polega na tym, że wysyłam więcej danych w VBO na wierzchołek (16 spławików zamiast 3-zmiennoprzecinkowego w tłumaczeniu i może 4 ułamkowe), ale wymagam, aby moduł cieniujący wykonywał mniej pracy.

  3. Pomiń wszystkie powyższe ograniczenia, a zamiast tego wykonaj kompromis z osobnym wezwaniem do losowania dla każdego obiektu. Właśnie to jest "nauczane" w książkach, które czytam, bez wątpienia ze względu na prostotę.

Czy są inne popularne metody niż te?

Jako pytanie akademickie, jestem ciekawy, czy wszystkie powyższe są wykonalne i "dopuszczalne" lub czy jedno z nich jest wyraźnie zwycięzcą nad innymi? Jeśli miałbym używać wyłącznie pulpitu GL, to czy jest to podstawowy sposób osiągnięcia tego?

+3

Dobre pytanie, chciałbym zobaczyć dyskusję na temat różnych zalet i wad tych różnych technik. –

+1

Jest to zdecydowanie zbyt specyficzne dla sprzętu, aby zapewnić rozsądne lub dokładne zalecenia na tak szerokiej gamie platform sprzętowych. Nawet dyskusja, kiedy należy użyć instancji, jest zbyt specyficzna dla sprzętu. Mówisz w zasadzie o miesięcznym projekcie badawczym profilowania. –

+3

@NicolBolas ok ... więc przypuśćmy, że pominiemy dyskusję o instancji; Czy mówisz, że dyskusja na temat innych technik nie ma sensu? Ludzie próbują różnych rzeczy przy pomocy VBO i shaderów, z pewnością istnieją pewne ogólne pomysły na temat tego, o czym należy pamiętać, lub powody, dla których niektóre z tych sugestii nie są dobre, itp. – johnbakers

Odpowiedz

11

dwa względy:

Ogólnie rzecz biorąc, jeśli masz wiele przedmiotów, z każdego obiektu za pomocą niezależnych transformacji, korzystania z wielu połączeń rysować. Po to są . Stara prezentacja "Partia wsadowa" firmy NVIDIA zawierała od 10 000 do 40 000 odsłuchów na klatkę (w D3D, więcej w GL) dla procesora GPU 1 GHz. W dzisiejszych czasach patrzysz raczej na coś więcej. Więc jeśli nie masz do czynienia z dziesiątkami tysięcy pojedynczych obiektów, wszystkie z nich są różne (więc bez instancji), szanse są dobre, że wszystko będzie dobrze.

Inny pomysł:

Take obliczeń macierzowych ModelView z shadera całkowicie i po prostu przekazać wierzchołki po mnożenia.Pozwala to na wywołanie pojedynczego wyciągnięcia dla wielu obiektów w różnych orientacjach i tłumaczeniach. Koszt dotyczy wszystkich obliczeń procesora, ale przypuszczam, że jeśli to wąskie gardło nie jest tak duże, jak wąskie gardło wielu wywołań, byłoby warto.

(Taken from here.)

5

Oto alternatywny pomysł:

Daj każdego wierzchołka identyfikator obiektu, który jest przekazywany w za pomocą atrybutu. Następnie w Vertex Shader, użyj tego ID, aby wykonać wyszukiwanie w teksturach, w których przechowywane są macierze transformacji.

+0

Ah, wyszukiwania tekstur. Założę się, podoba mi się. Dzięki. – johnbakers

+0

Grałem z tym podejściem, to coś w stylu Sprites. Oczywiście musisz naciskać teksturę za każdym razem, ale to tylko garść, znacznie mniejsza niż wierzchołki. W moim uproszczonym przypadku użyłem vec4s w jednym wierszu do translacji xyz plus obrót y. Pełna matryca w fakturze nie zawsze może być potrzebna. –

Powiązane problemy