2016-10-29 7 views
1

Я использую два SSBO в фрагментном шейдере. Для каждого фрагмента я делаю вычисление, и, если выполняется какое-то условие, я пишу координаты пространства-пространства фрагмента/пикселя (они переданы в шейдер фрагмента) на один SSBO и цвет фрагмента на другой. Затем SSBO считываются приложением, а те пиксели, которые были сохранены в SSBO, передаются следующему рендерингу.Значение параметра размера в SSBO

Параметр размера в

void glBufferData(GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage); 

может иметь два значения на данный момент: 2500 или 20000.

Для проходов, где size = 2500, все работает нормально. Как только size = 20000, то большинство пикселей перестают регистрироваться в SSBO.

Мой вопрос: каково фактическое значение параметра размера? Является ли это размером того, что может быть записано в каждом инстинкте фрагмента (в этом случае он будет только один vec4 за SSBO на фрагмент) или это размер всех инстанций в каждом проходе рендеринга (в этом случае 2500 или 20000 vec4 за SSBO)?

+3

Размер, передаваемый 'glBufferData()', является размером буфера в байтах. Не уверен, что в вашем вопросе есть что-то конкретно для SSBOs или просто основная функция 'glBufferData()'. –

+0

'glBufferData' выделяет и (если' data' не является нулевым) заполняет буфер исходными данными, переданными на вызов. Если у вас возникли проблемы с пониманием того, что означает 'size' в этом вызове API, вы, вероятно, перекрываете буфер каждый раз, когда вы вызываете эту функцию. –

ответ

0

Я полагаю, что ваши SSBOs содержат vec4. Их размер - их общий размер - это байт (как сказал Рето Коради) для одного кадра, он каждый раз сбрасывает его с glBufferData. A vec4 - 16 байт (4 байта на float, они 32 бит). Таким образом, размер 2500 означает 2500/16 = 156 (.25) vec4s. 20000 байт - 1250 vec4s.

+0

Спасибо. Вы отвечаете на мой вопрос. Я подумал, что я неправильно интерпретирую значение параметра размера. Я вижу это, как вы и Коради понимаете это: размер полного буфера для полного кадра. И просто, чтобы все было ясно, размер был либо 20000 * sizeof (vec4), либо 2500 * sizeof (vec4), а vec4 - 16 байт. – RobertB

+0

Я рад, что ты понял! – Talesseed