Каковы последствия разматывания буферов OpenGL?


Следуя вместе с учебниками здесь , чтобы получить введение в OpenGL 3.3, я понимаю, что вершинные и индексные буферы должны быть связаны с glBindBuffer (), чтобы выдавать им команды. Есть упоминание о том, что можно отменить привязку буферов, передав дескриптор 0 в glBindBuffer (), что кажется хорошей идеей, чтобы предотвратить случайное использование неправильного буфера, когда вы закончите его использовать. Есть ли какая-либо причина не всегда отменять привязку буферов вершин и индексов после выдача настроек или ничья звонки?

1 3

1 ответ:

Из - за архитектуры OpenGL как государственной машины, такие темы часто поднимаются-и нет окончательного ответа. Привязки буфера влияют на операции различных других команд GL, в зависимости от цели привязки.

В некоторых случаях Объект 0 представляет некоторый случай" нет буфера/объекта по умолчанию". Например, с помощью GL_PIXEL_UNPACK_BUFFER, используя 0, вы сможете передавать пиксельные данные непосредственно из клиентской памяти в GL - поэтому, если вы хотите это сделать, вам абсолютно необходимо отменить любую привязку PBO в какой-то момент. Если вы делаете это как можно раньше или как можно позже, это зависит от вас как программиста и в значительной степени зависит от архитектуры вашего программного обеспечения. Общее правило должно заключаться в том, чтобы избегать ненужных изменений состояния, и это включает операции привязки буфера (un). Но следование этому маршруту часто приводит к ситуациям, когда некоторые состояния "утекают" из области, для которой они действительно предназначались, - и такие вещи могут раздражать отладку.

В других случаях 0 не является допустимым состоянием для выполнения что-нибудь. Например, современный GL требует, чтобы вы использовали VBO. На самом деле нет необходимости когда - либо привязывать 0 как GL_ARRAY_BUFFER, поскольку единственный вариант использования для этого - указание некоторого указателя attrib на клиентскую память-исчез. Таким образом, разматывание VBO всегда является пустой тратой времени - в следующий раз, когда вы устанавливаете указатель attrib, вам все равно придется связать некоторые VBO, и если вы не устанавливаете указатель attrib, эта цель привязки совершенно неуместна.