2011-01-10 15 views
35

Co jest lepsze?Porządkowanie shaderów GLSL w silniku OpenGL

  1. Aby mieć jeden program cieniowania z dużo mundurów określającego światła do zastosowania lub mapowania zrobić (np muszę jedno oczko być odwzorowany paralaksy, a drugi paralaksy/lustrzane odwzorowaną). Zrobiłbym listę umundurowanych mundurów dla leniwych transferów i po prostu zmieniam kilka mundurków dla każdej kolejnej siatki, jeśli będzie to konieczne.

  2. Aby mają wiele programów cieniujących dla każdej potrzebnej przypadku, każdy z niewielką ilością mundurach, a nie leniwy wiążą z glUseProgram dla każdej siatki czy to musi zrobić. Tutaj zakładam, że siatki są prawidłowo grupowane, aby uniknąć zbędnych przełączników.

Odpowiedz

28

Większość współczesnych silników ma "pamięć podręczną shaderów" i korzysta z drugiej opcji, ponieważ podobno jest szybsza.

Możesz również rzucić okiem na ARB_shader_subroutine, który umożliwia dynamiczne powiązanie. Ale myślę, że jest dostępna tylko na sprzęcie klasy DX11.

+2

Uważam, że to prawda. Widząc jak OpenGL4 w pewnym stopniu reprezentuje DX11 w funkcjach, poszedłem do przodu i spojrzałem na "dziennik zmian" na 4.1, i wydaje się, że jest (http://en.wikipedia.org/wiki/Opengl#OpenGL_4.1): "Zredukowany razy kompilacji shaderów z możliwością zapytania i załadowania pliku binarnego dla obiektów programu cieniującego " –

15

Ogólnie opcja 2 będzie szybsza/lepsza, chyba że masz naprawdę ogromną liczbę programów. Możesz także użyć obiektów buforowych udostępnianych w różnych programach, więc nie musisz resetować żadnych wartości podczas zmiany programów.

Ponadto po połączeniu programu można zwolnić wszystkie moduły cieniujące dołączone do programu. Spowoduje to zwolnienie całego kodu źródłowego i wszelkich informacji wstępnego łącza, które kierowca utrzymuje, pozostawiając w pamięci tylko w pełni powiązany program.

+0

Co to są obiekty buforowe? –

+0

Prawdopodobnie wierzchołki obiektów buforowych. – Oscar

+7

Jednolite obiekty bufora, nowa funkcja w GL4. –

0

Byłbym skłonny wierzyć, że to zależy od konkretnego zastosowania. I tak, ponieważ bardziej wydajne byłoby mówienie o uruchomieniu 100 programów, w których każdy może mieć około 2-16 mundurów; może być lepiej mieć kompromis z dwóch. Miałem tendencję do myślenia, że ​​być może 10 - 20 programów dla najpopularniejszych technik cieniowania byłoby wystarczające lub kilka innych. Na przykład możesz chcieć mieć jeden program/moduł cieniujący do wykonania wszystkich mapowania wypukłości, jeden do wszystkich efektów mgły, jeden do wykonywania odbić, jeden do załatania załamań.

Teraz poza zakresem swoje pytanie myślę, że będzie to dotyczyć również tutaj, jedno włączenie do swojego silnika byłoby BatchProcess & BatchManager konfigurację klasy, aby zmniejszyć ilość CPU - GPU nazywa się autobus jak to będzie również są wydajne. Nie sądzę, że istnieje 1 rozwiązanie, które pasowałoby do wszystkich twoich pytań, ponieważ uważałbym, że byłoby to specyficzne dla aplikacji, podobnie jak ustalenie relacji pomiędzy ilością partii (wiader) wierzchołków (prymitywów), które posiadałby twój silnik a liczbą wierzchołki, które zawierałaby każda z tych partii.

Aby to wyjaśnić nieco lepiej: jedna gra może zawierać 4 kontenery lub partie, w których każda partia może pomieścić do 10 000 wierzchołków, aby można było uznać, że jest pełna, zanim BatchManager zdecyduje się opróżnić wiadro wysyłające wszystkie te wierzchołki na kartę graficzną dla rurociągu renderowania, który ma być przetwarzany i rysowany, gdy inna gra może mieć 10 wiader z 5000 wierzchołków, lub inna gra może mieć 8 segmentów z 120000 wierzchołkami.

Więc może być kompromis z próbą połączenia obu zgodnie z twoimi potrzebami. Jeśli masz 1 pojedynczy program z setkami mundurów; pojedynczy program jest łatwiejszy do zarządzania w ramach potoku, ale moduły cieniujące są zbyt kłopotliwe, aby je odczytać i nimi zarządzać.Z drugiej strony, programy cieniujące z bardzo niewielką liczbą mundurów są dość łatwe do odczytania i zarządzania, ale posiadanie 100 programów jest nieco trudniejsze w zarządzaniu procesorem przed połączeniem i wysłaniem, aby były poprawnie renderowane. Osobiście spróbuję znaleźć pośrednie miejsce, w którym mam wystarczająco dużo programów, aby wykonać każde konkretne zadanie, które jest całkowicie unikalne od siebie nawzajem, takie jak zagęszczenie mgły na jednym i wolumetryczne odwzorowywanie cienia na innym, gdzie każdy program ma wystarczającą liczbę mundurów do zrobienia. wymagane obliczenia.

Następnym krokiem będzie wykonanie kilku testów porównawczych, aby sprawdzić, na ile efektywność i obciążenie są zrównoważone, aby dokonać odpowiednich korekt.

Powiązane problemy