Насколько доступны для совместного использования индексы точек привязки 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и т. д.), и когда необходимо повторно привязать буферы?

0 ответов

Другие вопросы по тегам