Czy powinienem rozpowszechniać shadery w skompilowanej formie, czy jako zwykły tekst?

13

Jaka jest najlepsza strategia dla dystrybucji w świecie rzeczywistym oraz na komputery i urządzenia mobilne, mając aplikację korzystającą z shaderów napisanych w GLSL?

Zamierzam rozpowszechnić to w formie binarnej lub jako zwykły tekst zserializowany, chciałbym dobrą sugestię na ten temat.

użytkownik827992
źródło

Odpowiedzi:

15

Głównym powodem korzystania z binarnych programów cieniujących jest to, że kompilacja programów cieniujących tekst jest zbyt dużym obciążeniem dla urządzenia docelowego. Binarne moduły cieniujące GLSL nie mają znormalizowanego formatu, więc będziesz potrzebować różnych dla każdego procesora graficznego / sterownika, który zamierzasz obsługiwać. Polecam rozprowadzić shadery w formie źródłowej, a następnie przy pierwszym uruchomieniu buforować je do postaci binarnej, a następnie ładować stamtąd. Z drugiej strony najpierw sprawdzę, czy naprawdę istnieje wąskie gardło wydajności, które w ogóle uzasadnia użycie plików binarnych.

Jedną z rzeczy, które należy wziąć pod uwagę, jest również optymalizator shaderów offline, który może mieć świetny efekt w przypadku kiepskich mobilnych kompilatorów shaderów.

Tapio
źródło
Byłbym naprawdę zaskoczony, gdyby można znaleźć jakieś urządzenie, w którym kompilacja modułu cieniującego stanowi wąskie gardło. Ilość kodu, nawet w dużych modułach cieniujących, jest niewielką ilością kodu pod względem kompilacji.
edA-qa mort-ora-y
1
Duże silniki tam zwykle kompilują shadery offline i / lub buforują je przy pierwszym uruchomieniu, jak sugeruje Tapio. Być może w module cieniującym jest trywialna ilość kodu, ale możesz mieć ich dużo .
Laurent Couvidou
więc muszę kupić losową kartę wideo ATI i kolejną losową od Nvidii, skompilować moje shadery i rozpowszechniać tylko skompilowaną wersję? Jak mogę sprawdzić w czasie wykonywania, jaka jest marka docelowej karty wideo? Jest na to coś niezawodnego?
user827992,
1
@ user827992 Format binarny może być inny dla różnych generacji procesorów graficznych / sterowników, nawet jeśli sprzedawca jest taki sam. I nie zapomnij o wielu procesorach graficznych Intel, nie mówiąc już o wszystkich urządzeniach mobilnych, takich jak Qualcomm i PowerVR. Więc jeszcze raz: sugeruję, abyś nie dystrybuował skompilowanych shaderów, ale raczej buforował je przy pierwszym uruchomieniu na urządzeniu użytkownika. Jeśli chodzi o wykrywanie GPU, możesz spróbować parsować ciągi GL_VENDOR, GL_VERSION i GL_RENDERER z glGetString (), ale ich format różni się w zależności od dostawcy.
Tapio