Недетерминированный 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 и не повторялся):
Разве SSBO не должен иметь
GL_BUFFER_DATA_SIZE
=36, учитывая мой звонокglBufferData
? Если да, то это ошибка драйвера? Если заявленный размер 32 правильный, не могли бы вы объяснить, почему это имеет смысл?Являются ли
GL_ARRAY_SIZE
а такжеGL_OFFSET
верный?Учитывая, что проверка
glBufferSubData
звонки, мой массивglm::vec4[2]
описывает правильные, детерминированные данные, есть ли в этой трассировке что-нибудь, что могло бы объяснить, почему, когда я прочиталb_components.colour[i]
вfor (int i = 0; i < b_components.count; ++i)
что я получаю недетерминированные результаты?