GLSL: Отбрасываются (или отменяются) записи в буферы хранения шейдеров последующим оператором сброса? - PullRequest
2 голосов
/ 18 апреля 2020

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

Теперь я наткнулся на этот раздел OpenGL на khronos.org Wiki (выделено мной):

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

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

Я изучил GLSL 4.5 Спецификация , но я не смог найти ничего, что поддерживает утверждение из вики.

Также: если это так, возможно, более поздние записи в буфер общего хранилища не сбрасываются ред

1 Ответ

3 голосов
/ 18 апреля 2020

Спецификация понятна и однозначна. См. OpenGL Shading Language 4.60 Спецификация - 6.4. Jumps :

[...] Это ключевое слово приводит к удалению фрагмента и обновлению каких-либо буферов не будет. На любые предыдущие записи в другие буферы, такие как буферы хранения шейдера, это не влияет . [...]

Таким образом, существует возможность записи в SSBO и после этого discard запись в кадровый буфер, поскольку предыдущие записи в SSBO не затрагиваются.


См. Далее 4.60 изменений ревизии и отмена с предыдущими операциями загрузки / сохранения изображения или SSBO # 118

[...] во время работы шейдера, обновление внешне видимое буферы и было бы неработоспособным сказать, что эти обновления как-то больше не присутствуют после более позднего discard [...]

...