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]
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.
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.
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?
Dobre pytanie, chciałbym zobaczyć dyskusję na temat różnych zalet i wad tych różnych technik. –
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. –
@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