Чи потрібно мені перевпорядковувати уніформи або атрибути при зміні шейдерних програм?


11

Візуалізація сцени зазвичай передбачає більше однієї програми шейдерів, які, в моєму випадку, всі використовують однакові атрибути та діляться принаймні деякою формою одягу. Для того, щоб вони працювали належним чином, я в даний час граю в безпеку, це означає, що я перев’язую атрибути і отримую відповідні однакові місця кожного разу, коли перемикаюся між програмами шейдерів. Так що в основному багато разів у кожному кадрі, що, мабуть, не найкращий підхід.

Отже, чи потрібно (взагалі) після перемикання шейдерних програм відновлювати атрибути та обмундирування? І чому?

Якщо так, чи є спосіб зробити це один раз при запуску програми і ніколи більше не доторкатися до них (крім встановлення рівномірних значень)?

Відповіді:


12

Вам не потрібно повторно пов’язувати атрибути, якщо ви переконаєтесь, що їх розташування залишається однаковим в обох шейдерах. (Зазвичай, використовуючи layout(location = X)синтаксис у GLSL, але це також можна зробити, glBindAttribLocationякщо попередній недоступний.)

Уніформи, однак, є частиною стану об’єкта шейдера, і тому їх потрібно буде встановлювати принаймні один раз для кожного шейдера. Один із способів мінімізувати витрати на це - використовувати об’єднаний об'єкт буфера , який буде містити всі ваші однакові значення, а потім може бути прив’язаний до шейдера за допомогою одного виклику.


На вашому посиланні UBO: "Нарешті, вони можуть бути використані для обміну інформацією між різними програмами. Таким чином, зміна одного буфера може ефективно дозволяти оновлювати уніформи в декількох програмах."
Зуч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.