2016-05-14 5 views
2

Согласно слайд 23 из NVIDIA's OpenGL 4.5 Update presentation верно следующее:glBindBuffer и прямой доступ к государству?

Non-АСС: glGenBuffers + glBindBuffer

АСС: glCreateBuffers

я пытался писать только DSA программу. При использовании glDrawArraysIndirect рисовать я вынужден использовать glBindBuffer по glCreateBuffers


Вот фрагмент рабочего кода:

glCreateBuffers(1, &bufObj); 

glBindBuffer(GL_DRAW_INDIRECT_BUFFER, bufObj); //If deleted creates SEGFAULT crash 

glNamedBufferData(bufObj, sizeof(mydrawcall), mydrawcall, GL_STATIC_DRAW); 
... 
glDrawArraysIndirect(GL_TRIANGLES, 0); 

  • ли glBindBuffer не-АСС?
  • Я пропустил еще одну новую функцию DSA или это единственный способ?
+0

«* Если удаленный создает сбой SEGFAULT *« Где именно вы попали в эту катастрофу? Потому что, если вы получили его в 'glDrawArraysIndirect', вы в порядке. –

ответ

4

Цель прямого доступа к государственному доступу заключается не в том, чтобы полностью удалить привязку объектов из вашего приложения (что было бы целью различных расширений без привязки). Цель прямого доступа государства, чтобы позволить вам доступсостояния объекта без, имеющего связывать его (то есть: прямой LY).

Pre-DSA, вам нужно было связать буфер, чтобы выделить хранилище, загрузить данные и т. Д. С функциями DSA вам не нужно. Вы передаете буфер непосредственно функции, которую вы используете для управления своим состоянием.

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

Чтобы использовать хранилище буфера как uniform data, он должен быть привязан к контексту с помощью glBindBufferRange(GL_UNIFORM_BUFFER (или эквивалентных вызовов). Чтобы использовать буфер для хранения данных вершин, вы должны attach it to a VAO through glVertexArrayVertexBuffer, а затем привяжите это VAO к контексту. Чтобы использовать буфер для pixel transfer operations, вы должны привязать буфер к соответствующему местоположению с помощью glBindBuffer. И так далее.

То же самое касается использования буфера в качестве источника для выполнения косвенной команды. Это операция рендеринга, поэтому буфер должен быть привязан к косвенной цели перед выдачей косвенной команды.

Но он должен быть привязан только в момент выдачи этой команды. Вам не нужно связывать его сразу после создания. Прямо перед тем, как позвонить по телефону glDrawArraysIndirect.

Смежные вопросы