Organizowanie shaderów GLSL w silniku OpenGL

Który jest lepszy ?

  1. Aby mieć JEDEN program shader z dużą ilością uniformów określających lights to use, or mappings to do (E. G. I need one mesh to be parallax Maped, and another one parallax / specular Maped). Zrobiłbym buforowaną listę mundurów dla leniwych transferów i po prostu zmieniłbym kilka mundurów dla każdej następnej siatki, jeśli trzeba.

  2. Aby mieć wiele programów shader dla każdego potrzebnego przypadku, każdy z niewielką ilością uniformy i wykonaj Lazy bind za pomocą glUseProgram dla każdej siatki, jeśli będzie taka potrzeba. W tym miejscu zakładam, że oczka są odpowiednio dobrane, aby uniknąć nadmiarowych przełączników.

Author: Patryk Czachurski, 2011-01-10

3 answers

Większość nowoczesnych silników, jakie znam, ma "shader cache" i używa drugiej opcji, ponieważ najwyraźniej jest szybsza.

Możesz również spojrzeć na ARB_shader_subroutine, który umożliwia dynamiczne łączenie. Ale myślę, że jest dostępny tylko na sprzęcie klasy DX11.

 28
Author: Axel Gneiting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 18:14:17

Ogólnie rzecz biorąc, opcja 2 będzie szybsza / lepsza, chyba że masz naprawdę ogromną liczbę programów. Można również używać obiektów bufora współdzielonych między programami, dzięki czemu nie trzeba resetować żadnych wartości podczas zmiany programów.

Ponadto, po połączeniu programu, możesz uwolnić wszystkie shadery, które połączyłeś z programem. Zwolni to cały kod źródłowy i wszelkie informacje o pre-linku, które sterownik przechowuje, pozostawiając tylko w pełni połączony program w pamięci.

 15
Author: Chris Dodd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-10 19:37:33

Wydaje mi się, że zależy to od konkretnego zastosowania. I tak, ponieważ lepiej byłoby powiedzieć Uruchom 100 programów, gdzie każdy może mieć około 2-16 mundurów każdy; może lepiej mieć wymianę z tych dwóch. Wydaje mi się, że wystarczy powiedzmy 10 - 20 programów do najczęstszych technik cieniowania lub kilka więcej. Na przykład możesz chcieć mieć JEDEN program / shader do wszystkich mapowania wypukłości, jeden do wszystkich efektów mgły, jeden do refleksji, drugi do refrakcji.

Teraz poza zakresem twojego pytania myślę, że dotyczy to również tutaj, jedną rzeczą do włączenia do Twojego silnika byłaby konfiguracja klasy BatchProcess & BatchManager, aby zmniejszyć ilość wywołań CPU-GPU przez magistralę, ponieważ byłoby to również efektywne. Myślę, że nie ma 1 pasuje do wszystkich rozwiązań na twoje pytanie, ponieważ uważam, że byłoby to specyficzne dla aplikacji, tak samo jak ustalenie relacji między ile partie (wiadra) wierzchołków (primitives) Twój silnik będzie miał i ile wierzchołków każda z tych partii będzie zawierać.

Aby to wyjaśnić: jedna gra może mieć 4 kontenery lub partie, w których każda partia może pomieścić do 10 000 wierzchołków, które należy uznać za pełne, zanim Menedżer BatchManager zdecyduje się opróżnić to wiadro, wysyłając wszystkie te wierzchołki do karty graficznej w celu przetworzenia i narysowania potoku renderowania, gdzie inna gra może mieć 10 wierzchołków. z 5000 wierzchołków, lub inna gra może mieć 8 wiadra z 12000 wierzchołków.

Więc może być kompromis próbując połączyć te dwa zgodnie z Twoimi potrzebami. Jeśli masz 1 pojedynczy program z 100 uniformami; pojedynczy program jest łatwiejszy do zarządzania w potoku, ale shadery byłyby zbyt kłopotliwe do odczytu i zarządzania. Następnie ponownie mieć shadery z bardzo niewielu uniformów jest dość łatwe do odczytania i zarządzania, ale mając 100s programów jest trochę trudniejsze do zarządzania na CPU przed połączeniem i wysłaniem ich do poprawnego renderowania. Osobiście starałbym się znaleźć pośrednią drogę do tego, gdzie mam wystarczająco dużo programów, aby wykonać każde konkretne zadanie, które jest całkowicie unikalne od siebie, takie jak wykonywanie gęstości mgły na jednym i objętościowe odwzorowanie cienia na drugim, gdzie każdy program ma wystarczająco mundurów, aby wykonać wymagane obliczenia.

Następnym krokiem byłoby wykonanie testów na stanowisku, aby sprawdzić, gdzie wydajność i koszty są zrównoważone, aby odpowiednie dostosowania.

 0
Author: Francis Cugler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-14 01:20:11