Кажется, у меня есть недетерминированные данные в моем буфере хранения шейдеров.
Я использовал 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)
, я получаю недетерминированные результаты?
glGenBuffers
? Это разрешено только в совместимости с OpenGL. - person Nicol Bolas   schedule 12.09.2019glGenBuffers
, я просто не показываю вам всю программу. Кроме того, почему вы отметили это как дубликат? Я ничего не вижу там о неожиданных значенияхGL_BUFFER_DATA_SIZE
? - person spraff   schedule 12.09.2019std140
(это то, что предоставляет дубликат), это должно быть все, что вам нужно, чтобы понять, почему 36 не является подходящим минимальным размером для вашего блока хранения, как он определен, и почему 32 делает далеко больше смысла. - person Nicol Bolas   schedule 12.09.2019