2016-09-28 5 views
1

Я пытаюсь получить мою голову вокруг следующего:OpenGL - переключатель шейдеры

Я объект, который я хочу, чтобы иметь возможность визуализации с двумя различными наборами вершин/фрагментами шейдеров, что у каждого есть свой формы и текстуры, и идти туда и обратно между этими двумя настройками. (Я знаю, что в этом случае я мог бы только один шейдер с равномерным диктовала логику для запуска, но это является частью более крупных вещами, где я не могу этого сделать)

  • Должен ли я использовать один или два гл программы (созданные glCreateProgram())?
  • Если я использую две программы, можно ли отменить тот, который не используется, и перестроить его, если потребуется позже? Или это слишком медленно?
  • Если я использую только одну программу:
    • я могу скомпилировать шейдер только один раз в начале?
    • при переключении следует отключить старые шейдеры, подключить новые и снова связать программу?
    • Должен ли я перекомпоновать все места униформы после связывания?
    • Должен ли я пересобирать буферы массивов после связывания?
    • Должен ли я что-то сделать, чтобы удалить ранее прикрепленные текстуры?
+0

Создание и связывание шейдеры это Usally очень медленная операция. Я бы рекомендовал просто создать две программы в начале и использовать их, если это необходимо. Для получения дополнительной информации вам нужно будет предоставить более подробную информацию о вашем сценарии использования. Например, как часто нужно менять шейдер. – BDL

ответ

3

Должен ли я использовать одну или две программы GL (созданные glCreateProgram())?

Это зависит от случая. Общим правилом можно избежать разветвления внутри шейдерного кода. Поэтому, если у вас есть 2 разных шейдера, для 2 разных эффектов просто скомпилируйте 2 программы и привяжите их.

Если я использую две программы, это прекрасно, чтобы выбросить один не используется, и восстановить его, если потребуется в дальнейшем? Или это слишком медленно?

Это, как правило, не нужно и не так (возможно, если у вас нет огромных проблем с памятью). Компиляция шейдера - медленный процесс.

Более часто собирать все необходимые ресурсы один раз, при запуске приложения или в первый раз, и оставлять их выделенными и готовыми к использованию.

Можно ли скомпилировать шейдеры только один раз в начале?

Да.

За все оставшиеся вопросы: Я думаю, вы принимаете неправильный подход.

Я бы сказал:

  • Compile все варианты шейдеров в начале (или когда вам нужна программа)
  • Bind затенение и относительные ресурсы, устанавливать форму перед нанесением с этим шейдером.
  • Когда изменение шейдер, повторно связать ресурсы или обновить единые ценности, только если разные и нужны
  • высвобождению ресурсов и программ в конце приложения
+0

Я передаю видеовыход моему объекту, поэтому я немного беспокоюсь о том, чтобы использовать слишком много ресурсов, если я не выпущу текстуру в программе, которая не используется. Doest это звучит как законное беспокойство? Спасибо за все остальные комментарии! – Guig

+1

Память, используемая текстурой, не имеет ничего общего с самой программой шейдера. – Heisenbug

+0

Хорошо, но если я создаю две программы, используйте первую, прикрепите текстуру, переключитесь на вторую программу, прикрепите другую текстуру, использую ли я память для первой текстуры, прикрепленной к программе, которая не используется? или является текстурой, независимой от контекста программы? – Guig

 Смежные вопросы

  • Нет связанных вопросов^_^