2012-03-13 11 views
6

Jak szybki jest glUseProgram()? Czy jest coś lepiej (szybciej) ?:Zachowanie mundurów po glUseProgram() i prędkości

Oto moje myśli:

  1. Zastosowanie 1 uniwersalny program shader, ale z wielu ustawień wejściowych i atrybutów (ustawienia dla każdej klasy Graphics)
  2. używać więcej niż 1 moduł cieniujący dla każdej klasy grafiki

W jakim stanie są uniformy po zmianie programu cieniującego? Czy zapisują wartości (na przykład wartości matryc)?

Oto co uważam korzyści nr 1 będzie:

  • Nie używa glUseProgram()

a korzyści z # 2:

  • Nie zmiany macierzy (na przykład, jeśli klasa Menu i klasa Scene3D mają różne macierze rzutowania)

Odpowiedz

6

To, która opcja jest lepsza, zależy w dużej mierze od tego, co robią te shadery, od tego, jak się różnią, od tego, ile atrybutów/mundurów ustawiłeś i jak często się zmieniają. Nie ma jednej słusznej odpowiedzi we wszystkich przypadkach.

To powiedziawszy: Należy pamiętać, że nie tylko koszt zmian stanu, ale także koszt wykonania modułu cieniującego jest płacony za każdy wierzchołek i fragment. Utrzymanie złożoności niskiego poziomu cieniowania jest zawsze dobrym pomysłem, a uniwersalny moduł cieniujący jest bardziej złożony niż wyspecjalizowany.

Zminimalizuj zmianę stanu. Jeśli masz obiekty A, C, E używające Programu X i B, D, F używając Programu Y, a wszystkie pozostałe są równe, renderuj w kolejności ACEBDF, a nie ABCDEF.

Odnośnie ostatniego pytania: Programy zachowują swój stan, a więc wartości mundurów, przez cały okres ich istnienia, chyba że je zsynchronizujesz. Ale mundury są na stan programu, co oznacza, że ​​jeśli masz dwa mundury o tej samej nazwie i typie w różnych programach, wartości nie będą przenoszone z jednego programu do drugiego.

+0

"To, która z opcji jest lepsza, zależy w dużej mierze od tego, co robią te shadery" - Zadanie jest proste - renderowanie z teksturowaniem, bez żadnych efektów (tylko niektóre muszą mieć efekty cieniowania). –

+0

Jeśli niektóre z nich są bardzo proste, a niektóre mają pewien efekt, to powinienem mieć prosty moduł cieniujący z teksturowaniem (zakładając, że jest to wersja otwarta 2.x lub nowsza) i jedną dla klasy efektu. Ale naprawdę trudno jest osądzać, nie wiedząc więcej. Prawdopodobnie nie będzie miało to większego znaczenia. Jeśli nie masz problemów z wydajnością i wiesz, że to ze względu na zmiany stanu, po prostu rób to, co jest wygodniejsze. – haffax

+1

Mundury mogą być współdzielone między programami za pomocą Uniform Buffer Object (patrz np. [Shared Uniforms] (http://arcsynthesis.org/gltut/Positioning/Tut07%20Shared%20Uniforms.html)) – stativ

Powiązane problemy