2015-11-13 4 views
1

Глядя на спецификации uniform_buffer_object, нет гарантии, что определенный единый блок, определенный таким же образом в нескольких программах шейдера, будет иметь тот же индекс, который возвращается glGetUniformBlockIndex(). Это означает, что я должен позвонить glBindBufferBase(), чтобы присвоить UBO соответствующий индекс каждый раз, когда я переключаю программу шейдеров.Единый индекс блока в разных шейдерах

Однако, из-за некоторого тестирования он выглядит как единый блок . имеют одинаковый индекс в разных шейдерных программах, даже если единые блоки объявлены в разных порядках. Посмотрите на эти два вершинных шейдера: one, two. (Обратите внимание, я использовал значение из v1, v2 .. и т.д., чтобы избежать неактивных ликвидаций единообразных)

При запросе индексов, как это:

std::cout << glGetUniformBlockIndex(prog1, "var1") << "\n"; 
std::cout << glGetUniformBlockIndex(prog2, "var1") << "\n"; 

я получаю такое же значение индекса. Я получаю те же результаты при запросе "var2", "var3" и так далее.

Это предназначение? Почему это происходит? Могу ли я полагаться на это всегда?

ответ

3

После получения индекса вы должны установить обязательный пункт:

glUniformBlockBinding(prog1, glGetUniformBlockIndex(prog1, "var1"), 1); 
glUniformBlockBinding(prog2, glGetUniformBlockIndex(prog2, "var1"), 1); 

Сейчас 1 является точкой привязки var1 в каждой программе.

Вы также можете установить связывание в GLSL явно:

layout(binding = 3) uniform MatrixBlock 
{ 
    mat4 projection; 
    mat4 modelview; 
}; 
+1

Круто, я не знал этого. Однако это ядро ​​только в opengl 4.2 и более поздних версиях. – Pilpel

+1

@pilpel Я просто собирался найти поддерживаемую версию, спасибо! – legends2k

+0

Обратите внимание, что в моей конфигурации под linux (r600-hd3400) с последней версией mesa работает layout (index = 1), и невозможно получить UniformBlockIndex на стороне процессора. –

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