Недетерминированный SSBO имеет слишком маленький GL_BUFFER_DATA_SIZE после glBufferData

Кажется, у меня в буфере хранилища шейдеров есть недетерминированные данные.

я использовал apitrace для проверки конечного автомата и заметил следующую последовательность вызовов функций в трассировке:

glBindBuffer (GL_SHADER_STORAGE_BUFFER, 3);
glBufferData (GL_SHADER_STORAGE_BUFFER, 36, NULL, GL_DYNAMIC_DRAW);
glBufferSubData (GL_SHADER_STORAGE_BUFFER, 0, 4, [binary data, size = 4 bytes])
glBufferSubData (GL_SHADER_STORAGE_BUFFER, 4, 32, [binary data, size = 32 bytes])

Это кажется правильным в соответствии с кодом приложения более высокого уровня, он соответствует настройке этого

layout (std140) buffer Components
{
    int count;
    vec4 colour [];
}
b_components;

в массив с префиксом длины glm::vec4[2].

Однако, apitrace показывает, что GL_BUFFER_DATA_SIZE 32, а не 36, на каждом этапе в приведенной выше трассировке.

Также вот осмотр SSBO:

Components.colour[0] имеет GL_ARRAY_SIZE=0 (разве это не должно быть ненулевым?) И GL_OFFSET=16 (разве это не должно быть 4?)

Программа очень проста, поэтому для наглядности вот полный график (это для кадра 1, glBufferData(...,36,...) был в кадре 0 и не повторялся):

  1. Разве SSBO не должен иметь GL_BUFFER_DATA_SIZE=36, учитывая мой звонок glBufferData? Если да, то это ошибка драйвера? Если заявленный размер 32 правильный, не могли бы вы объяснить, почему это имеет смысл?

  2. Являются ли GL_ARRAY_SIZE а также GL_OFFSET верный?

  3. Учитывая, что проверка glBufferSubData звонки, мой массив glm::vec4[2] описывает правильные, детерминированные данные, есть ли в этой трассировке что-нибудь, что могло бы объяснить, почему, когда я прочитал b_components.colour[i] в for (int i = 0; i < b_components.count; ++i) что я получаю недетерминированные результаты?

0 ответов

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