#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
использовать текущий связанный буфер для операций.