Глядя на спецификации uniform_buffer_object, нет гарантии, что определенный единый блок, определенный таким же образом в нескольких программах шейдера, будет иметь тот же индекс, который возвращается glGetUniformBlockIndex()
. Это означает, что я должен позвонить glBindBufferBase()
, чтобы присвоить UBO соответствующий индекс каждый раз, когда я переключаю программу шейдеров.Единый индекс блока в разных шейдерах
Однако, из-за некоторого тестирования он выглядит как единый блок . имеют одинаковый индекс в разных шейдерных программах, даже если единые блоки объявлены в разных порядках. Посмотрите на эти два вершинных шейдера: one, two. (Обратите внимание, я использовал значение из v1
, v2
.. и т.д., чтобы избежать неактивных ликвидаций единообразных)
При запросе индексов, как это:
std::cout << glGetUniformBlockIndex(prog1, "var1") << "\n";
std::cout << glGetUniformBlockIndex(prog2, "var1") << "\n";
я получаю такое же значение индекса. Я получаю те же результаты при запросе "var2"
, "var3"
и так далее.
Это предназначение? Почему это происходит? Могу ли я полагаться на это всегда?
Круто, я не знал этого. Однако это ядро только в opengl 4.2 и более поздних версиях. – Pilpel
@pilpel Я просто собирался найти поддерживаемую версию, спасибо! – legends2k
Обратите внимание, что в моей конфигурации под linux (r600-hd3400) с последней версией mesa работает layout (index = 1), и невозможно получить UniformBlockIndex на стороне процессора. –