2013-04-07 6 views
0

я исследую относительно новую функцию GL_ARB_separate_program_object.What я понимаю, я должен создать объект трубопровода, который должен содержать шейдер из этапов, которые сопоставляются туда через glUseProgramStagesOpenGL отдельная программа этапов

Это заставляет меня думать о 2 возможности использования нескольких шейдеров:

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

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

glUseProgramStages 

Я в основном связан с опцией performance.Which является более высокой производительностью мудрым?

+0

Вы измеряли оба? Кроме того, я думаю, вы должны хранить объекты Pipeline, потому что они относительно дешевы, нет? –

+0

Я реализовал сегодня эту систему и не вижу ухудшения производительности.Но нужно видеть, влияет ли частое обновление объектов конвейера –

ответ

1

На ваш вопрос нельзя ответить, так как он будет меняться в зависимости от реализации драйвера и т. Д. Однако факты и история функциональности должны быть информативными.

EXT_separate_shader_objects было первым воплощением этой функциональности. Самая большая разница между ними заключалась в следующем: вы не могли использовать пользовательские изменения в версии EXT. Вы должны были использовать старые входы/выходы совместимости, такие как gl_TexCoord.

Issue #2 in the EXT_separate_shader_objects specification попытки оправдать эту непонятную надзор объясняет аргументирует это следующим образом:

Это нежелательно с точки зрения производительности, чтобы попытаться поддержать «Свидание по имени» для произвольных отдельных шейдеров, так как отдельные шейдеры не будут скомпилированы естественным образом для соответствия их различным входам и выходам с одинаковым именем без специального шага ссылки. Такая специальная ссылка приведет к дополнительным служебным накладкам для привязки отдельных шейдеров. Сама связь должна быть отложена до момента glBegin, поскольку отдельные шейдеры не будут совпадать при переходе от одного набора согласованных шейдеров к другому. Эта специальная ссылка все равно будет создавать ошибки или неопределенное поведение, если имена входных и выходных переменных совпадают, но их типы не совпадают.

Это говорит о том, что причина не полагаться на имя сопоставления , помимо некомпетентности, было связанных с производительностью (если вы не можете сказать, я не думаю, что очень высоко EXT_SSO). Выполнение «рандеву по имени» происходит от необходимости делать это при каждом призыве к призыву, а не в том, чтобы делать это один раз.

ARB_separate_shader_objects инкапсулирует коллекцию программ в объект. Следовательно, объект может хранить все данные «рандеву». Первый обратный вызов может быть медленнее, но последующее использование одного и того же PPO будет быстрым, если вы не присоединяете к нему новые программы.

Поэтому я хотел бы принять это как доказательство того, что у ПЗО должны быть установлены на них программы, а затем оставлены в покое. Как правило, следует избегать изменения объектов вложений. Вот почему вас поощряют не добавлять и не удалять текстуры/рендеринги из FBOs.

+1

Итак, простыми словами вы говорите: «Создавайте конвейеры столько, сколько вам нужно, и переключайтесь между ними, а не меняйте их каждый раз, когда требуется новая комбинация шейдеров». Это то, что вы имею в виду? –