Czy muszę zmieniać wiązania mundurów lub atrybutów podczas zmiany programów modułu cieniującego?

11

Renderowanie sceny zwykle wymaga więcej niż jednego programu do cieniowania, który w moim przypadku używa tych samych atrybutów i dzieli co najmniej niektóre mundury. Aby działały poprawnie, obecnie gram bezpiecznie, co oznacza, że ​​ponownie wiążę atrybuty i uzyskuję odpowiednie jednolite lokalizacje za każdym razem, gdy przełączam się między programami cieniującymi. W zasadzie wiele razy w każdej klatce, co prawdopodobnie nie jest najlepszym podejściem.

Czy więc (ogólnie) konieczne jest ponowne powiązanie atrybutów i mundurów po zmianie programów modułu cieniującego? I dlaczego?

Jeśli tak, to czy można to zrobić na początku programu i nigdy nie trzeba ich dotykać ponownie (z wyjątkiem ustawienia jednolitych wartości)?

Nero
źródło

Odpowiedzi:

12

Nie musisz ponownie wiązać atrybutów, o ile upewnisz się, że ich lokalizacja pozostaje taka sama w obu modułach cieniujących. (Zwykle przy użyciu layout(location = X)składni w GLSL, ale można to również zrobić, glBindAttribLocationjeśli poprzednia nie jest dostępna.)

Mundury są jednak częścią stanu obiektu cieniującego i dlatego należy je ustawić przynajmniej raz dla każdego modułu cieniującego. Jednym ze sposobów na zminimalizowanie tego kosztu jest użycie Uniform Buffer Object , który będzie zawierał wszystkie twoje jednolite wartości, a następnie może zostać powiązany z modułem cieniującym za pomocą jednego wywołania.

yuriks
źródło
W linku UBO: „Na koniec można ich używać do wymiany informacji między różnymi programami. Modyfikacja jednego bufora może więc skutecznie umożliwić aktualizację mundurów w wielu programach”.
Zouch