Чтобы создать единый буферный объект в 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, вы серьезно относитесь к желанию использовать буфер, а не просто изменять его.
Что, кажется, затрагивает то, в чем я путаюсь, но я не понимаю этого объяснения,Он говорит, что он связывает все, что было ранее связано с целью, что, кажется, подтверждает мою (неправильную) идею, что предварительная привязка буфера к цели не нужна.