Если выходные данные моего фрагментного шейдера являются массивом, мне разрешено не записывать в некоторые элементы в конце массива, учитывая, что значения этих элементов отбрасываются (не принимаются ни одной точкой присоединения кадрового буфера)?
Вам всегда разрешено не записывать ни в какие выходные переменные, независимо от того, используются они или нет.
Поскольку вы используете #version 150
, я имею в виду спецификацию GLSL 1.50 . Раздел 4.3.6 «Выходы» гласит (выделено мое):
Выход
переменные должны быть объявлены в глобальной области видимости. Во время выполнения шейдера они будут вести себя как обычно
неквалифицированные глобальные переменные. Их значения копируются на следующую стадию конвейера при выходе из шейдера.
Если вы объявите переменную и никогда не будете писать в нее, у вас будет неопределенное значение , но не неопределенное поведение .
Это также подтверждается спецификацией основного профиля OpenGL 3.2 , раздел 3.9 «Фрагментные шейдеры», подраздел «Выходы шейдеров»
Любые цвета или цветовые компоненты, связанные с фрагментом, которые не записаны фрагментом.
шейдеры не определены.
Более современные версии спецификации GL, например, Профиль ядра OpenGL 4.6 , еще яснее об этом (Раздел 17.4 «Операции с полным кадровым буфером»):
Если фрагментный шейдер выполняет запись в пользовательскую выходную переменную, DrawBuffers
задает набор буферов отрисовки, в которых определяется каждый из нескольких выходных цветов
по этим переменным пишутся отдельно. Если фрагментный шейдер пишет в no
определяемые пользователем выходные переменные, значения цветов фрагмента следуют за шейдером
исполнение не определено и может отличаться для каждого цвета фрагмента. Если некоторые, но не
все определяемые пользователем выходные переменные записываются, значения цветов фрагментов соответствуют
к неписаным переменным аналогично не определено.
Спецификация GLSL 1.50 продолжается:
Только выходные переменные, которые читаются на следующем этапе конвейера, должны быть записаны; разрешено
иметь лишние объявления выходных переменных.
Прекрасно не записывать в выходные переменные, которые все равно не будут использоваться.
Ваш второй вопрос немного сложнее:
Имеет ли присутствие этих неиспользуемых индексов какие-либо нежелательные эффекты или накладные расходы на общие реализации?
Спецификация GL никогда не дает таких гарантий. Я могу сказать только две вещи:
- Я никогда не замечал каких-либо негативных последствий наличия некоторых дополнительных неиспользуемых выходов FS (но я также делал это не очень часто). Я также не ожидал бы, что разумная реализация привнесет заметные накладные расходы в таком случае.
- Если вам действительно нужно быть уверенным, вы должны сравнить / профиль для фактических реализаций, которые вас интересуют.