Насколько доступны для совместного использования индексы точек привязки OpenGL между программами и типами буферов и когда мне нужно выполнять повторное связывание?
Объекты буфера хранилища шейдеров OpenGL должны быть привязаны к некоторому индексу точки привязки, а некоторый индекс блока хранилища шейдеров должен быть привязан к тому же индексу точки привязки, если этот блок должен использовать этот SSBO. Аналогично для Uniform Blocks и Uniform Buffer Objects.
У меня странное поведение, которое трудно отлаживать, и мне интересно, это потому, что я неправильно использую точки привязки.
Рассмотрим следующую коллекцию или объекты:
- две шейдерные программы:
P_a
а такжеP_b
- два блока хранения шейдеров:
SSB_a
вP_a
, а такжеSSB_b
вP_b
- два блока униформы:
UB_a
вP_a
, а такжеUB_b
вP_b
- два объекта буфера хранилища шейдеров
SSBO_p
а такжеSSBO_q
- два однородных буферных объекта
UBO_x
а такжеUBO_y
- какой-то программист-политический
BINDING_POINT_INDEX=7
или любое произвольное число
Когда эти буферы могут совместно использовать BINDING_POINT_INDEX
и когда нужно повторно связать эти буферы?
Распределены ли точки привязки между SSBO и UBO в рамках одной программы? т.е. могу ли я безопасно использоватьBINDING_POINT_INDEX
для связывания SSB_a
к SSBO_p
в P_a
одновременно с использованием BINDING_POINT_INDEX
для связывания UB_a
к UBO_x
в P_a
?
Совместны ли точки привязки между программами? т.е. могу ли я безопасно использовать BINDING_POINT_INDEX
для связывания SSB_a
к SSBO_p
в P_a
одновременно с использованием BINDING_POINT_INDEX
для связывания SSB_b
к SSBO_q
в P_b
?
Когда мне нужно заново привязать буферы? Если я сделаю это
glUseProgram (P_a);
glUniformBlockBinding (P_a, UB_a, BINDING_POINT_INDEX);
glBindBufferBase (GL_UNIFORM_BUFFER, BINDING_POINT_INDEX, UBO_x);
// UB_a is now bound to UBO_x in P_a
// Draw stuff...
glUseProgram (P_b);
glUniformBlockBinding (P_b, UB_b, BINDING_POINT_INDEX);
glBindBufferBase (GL_UNIFORM_BUFFER, BINDING_POINT_INDEX, UBO_y);
// UB_b is now bound to UBO_y in P_b
// Draw stuff...
glUseProgram (P_a);
На данный момент UB_a
все еще привязан к UBO_x
в P_a
?
Правильно ли я полагаю, что любая привязка, сделанная в одном контексте, не повлияет на привязки в другом контексте?
Каким образом индексы точек привязки разделяются между разными программами и разными типами буферов, какова правильная последовательность событий для их привязки (с точки зрения glUseProgram
, glBufferData
и т. д.), и когда необходимо повторно привязать буферы?