glBindBuffer и прямой доступ к состоянию?

Согласно слайду 23 презентации NVIDIA OpenGL 4.5 Update, верно следующее:

Без DSA: glGenBuffers + glBindBuffer

DSA: 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?
  • Я пропустил еще одну более новую функцию DSA или это единственный способ?

person Tek    schedule 14.05.2016    source источник
comment
Если удалить, возникает сбой SEGFAULT Где именно вы получаете этот сбой? Потому что, если вы получили его в glDrawArraysIndirect, все в порядке.   -  person Nicol Bolas    schedule 14.05.2016


Ответы (1)


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

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

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

Чтобы использовать хранилище буфера в качестве однородных данных, оно должно быть привязано к контексту с помощью glBindBufferRange(GL_UNIFORM_BUFFER (или эквивалентные вызовы). Чтобы использовать буфер для хранения данных вершин, вы должны подключить его к VAO через glVertexArrayVertexBuffer , затем привяжите этот VAO к контексту. Чтобы использовать буфер для операций передачи пикселей, необходимо привязать буфер к соответствующему местоположению с помощью glBindBuffer . И так далее.

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

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

person Nicol Bolas    schedule 14.05.2016