Понимание того, когда следует вызывать glBindBufferBase

#opengl

Вопрос:

У меня есть несколько SSBO, к которым нужно получить доступ в шейдере. Допустим, это что-то вроде

 layout(std430, binding = 2) readonly buffer MyBuffer
{
    int myData[];
};
 

Когда подходящее время для звонка glBindBufferBase ?

Прямо сейчас я делаю что-то вроде

 glBindBuffer(GL_SHADER_STORAGE_BUFFER, name)
glBufferData(...)
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0)
 

Я не знаю, устанавливает ли это какое-то глобальное состояние, при котором индекс 2 устанавливается для каждого шейдера, который я связываю и развязываю.

Можете ли вы сказать мне, есть ли какие-либо недостатки в этой идее:

 Create, Bind SSBO, upload data, unbind for the SSBO

Bind shader
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, name)
Draw arrays
Unbind shader
 

Это ожидаемый способ его использования? Я привязываю SSBO только один раз, загружаю, а затем никогда не привязываю его снова. Это, кажется, работает, но я понятия не имею, «просто работает» ли это, потому что мой графический процессор пытается быть умным для меня, или я нарушаю спецификацию (которую я прошел, но не смог найти ответ на этот вопрос). Я уже обжигался раньше, когда делал что-то, что будет работать на моем графическом процессоре, а затем потерпит неудачу на другом, и это заставляет меня сомневаться в том, что я делаю.

В идеале я хотел бы сделать один вызов функции, чтобы поменять в моем SSBO на какую-то привязку, а затем нарисовать. Я не уверен, смогу ли я сделать это до привязки шейдера, или шейдер должен быть привязан. Если есть лучший способ сделать это, пожалуйста, посоветуйте.

Короче говоря, конечная цель-это минимальный способ привязать SSBO к какому-либо индексу после того, как он будет готов к использованию после загрузки данных.

Ответ №1:

OpenGL-это государственный движок. Как только статус установлен, он сохраняется до тех пор, пока его снова не изменят (даже за рамками).
Объект буфера остается привязанным к целевому объекту индексированного буфера до тех пор, пока вы не свяжете другой объект буфера с той же точкой привязки. Вам нужно только позвонить glBindBuffer , потому что операции glBufferData и glBindBufferBase использовать текущий связанный буфер для операций.