Почему вы должны использовать как glBindBuffer, так и glBindBufferRange для создания единого буфера в OpenGL? - PullRequest
1 голос
/ 11 июня 2019

Чтобы создать единый буферный объект в OpenGL, почему я должен вызывать glBindBuffer и glBindBufferRange?Согласно документации ,

Думайте о glBindBufferRange как о связывании буфера с двумя местами: конкретным индексом и целью.glBindBuffer привязывается только к цели, а не к индексу.

Так что glBindBuffer мне кажется излишним, если вы уже привязываете буфер к той же самой цели, используя glBindBufferRange.

Я читаю Обучение современному программированию в трехмерной графике, а глава 7 показывает, как создавать единые буферные объекты.Код, используемый в книге:

glGenBuffers(1, &g_GlobalMatricesUBO);
glBindBuffer(GL_UNIFORM_BUFFER, g_GlobalMatricesUBO);
glBufferData(GL_UNIFORM_BUFFER, sizeof(glm::mat4) * 2, NULL, GL_STREAM_DRAW);
glBindBuffer(GL_UNIFORM_BUFFER, 0);

glBindBufferRange(GL_UNIFORM_BUFFER, g_iGlobalMatricesBindingIndex, g_GlobalMatricesUBO, 0, sizeof(glm::mat4) * 2);

Этот код работает, пока я не закомментирую вызов glBufferData, и в этом случае я получаю черный экран.Это удивляет меня, потому что впоследствии мы в любом случае привязываем g_GlobalMatricesUBO к GL_UNIFORM_BUFFER.Документация, на которую ссылаются ранее, также гласит:

Обратите внимание, что это не заменяет стандартную привязку буфера к glBindBuffer.Фактически он связывает буфер с целевым параметром, тем самым освобождая все, что было связано с этой целью.Но обычно, когда вы используете glBindBufferRange, вы серьезно относитесь к желанию использовать буфер, а не просто изменять его.

Что, кажется, затрагивает то, в чем я путаюсь, но я не понимаю этого объяснения,Он говорит, что он связывает все, что было ранее связано с целью, что, кажется, подтверждает мою (неправильную) идею, что предварительная привязка буфера к цели не нужна.

1 Ответ

4 голосов
/ 11 июня 2019

glBufferData не только инициализирует буфер, но и создает хранилище данных объекта буфера с указанным размером.Вы можете думать об этом как о выделении памяти в c ++.
glBufferData создает хранилище данных для объекта буфера, который в настоящее время связан с указанной целью.В этом случае он создает хранилище данных для именованного объекта буфера g_GlobalMatricesUBO, поскольку он привязан к указанной цели GL_UNIFORM_BUFFER.

glBindBufferRange не создает никаких данныхмагазин, он использует хранилище данных, которое должно существовать.Буферный объект с хранилищем данных указывается 3-м параметром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...