почему второй вызов glBindBuffer? - PullRequest
3 голосов
/ 22 декабря 2011

Я читаю в этом учебном пособии, и я приступаю к концу, как использовать Vertex Buffers, и я вижу, что буфер вершин, который я сгенерировал и вызвал glBindBuffer, уже один раз, мне нужно связатьво второй раз:

glBindBuffer(GL_ARRAY_BUFFER, vbo_triangle);

Я все еще новичок в openGL (например, 3 дня), поэтому я пытаюсь сосредоточиться на том, как многие из этих вещей работают.Я провожу большую часть своего времени на khronos или opengl.org, читая о командах, но я не мог понять, почему эта вызывается дважды.какие-нибудь намеки?Спасибо.

Ответы [ 3 ]

7 голосов
/ 22 декабря 2011

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

Однако, что произойдет, если вы вставите код после создания буфера, который создает второй буфер? В конце концов, вы можете иметь два объекта. Или 10. Или сколько хочешь; им не нужно совместно использовать буферные объекты.

Как только вы это сделаете, ваш код сломается, потому что буфер, который ваш код ожидает, что будет связан, на самом деле не связан. Поэтому, если вы не умеете управлять состоянием и действительно знаете, что делаете (и если вы все еще следуете учебным пособиям, ответ «нет»), вы должны установить любое состояние, необходимое для выполнения ваших намерений.

Поэтому, если вы собираетесь рисовать из определенного буфера, вы должны связать его и установить соответствующее состояние (вызовы gl*Pointer).

5 голосов
/ 22 декабря 2011

Вы должны связать и открепить буфер, чтобы скопировать в него из 'C' и рисовать с ним из openGL. Думайте об этом как о блокировке / разблокировке программы и графики.

Итак, последовательность
создать
связать
данные материала
отменить

1009 * привязывать * дисплей
отменить

2 голосов
/ 04 апреля 2015

Краткое описание: Второй обычно отменяет привязку первого.

Если буферный объект с буфером имен не существует, создается один с этим именем.Когда объект буфера привязан к цели, предыдущая привязка для этой цели автоматически прерывается.

Имена объектов буфера являются целыми числами без знака.Нулевое значение зарезервировано, но для каждого целевого объекта буфера отсутствует буферный объект по умолчанию.Вместо этого, буфер, установленный в ноль, эффективно отсоединяет любой ранее связанный объект буфера и восстанавливает использование клиентской памяти для этого целевого объекта буфера (если поддерживается для этой цели).Имена объектов буфера и соответствующее содержимое объекта буфера являются локальными по отношению к общему пространству объектов текущего контекста рендеринга GL;два контекста рендеринга совместно используют имена объектов буфера, только если они явно разрешают совместное использование между контекстами через соответствующие функции интерфейсов окон GL.Справка: https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml

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