2015-08-05 2 views
15

Учитывая, что мы используем OpenGL 4.5 или поддерживаем расширение GL_ARB_direct_state_access, у нас есть новая функция glCreateBuffers.Разница в glGenBuffers и glCreateBuffers

Этой функция имеет одинаковую подпись glGenBuffers, но указует:

возвращает n ранее неиспользуемые имена буфера в buffers, каждый из которых представляет собой новый объект буфера инициализирован, как если бы он был привязан к неустановленным целям

glGenBuffers имеет следующие характеристики:

Имена объектов буфера, возвращаемые вызовом glGenBuffers, не возвращаются последующими вызовами, если только они не были удалены с glDeleteBuffers.

Таким образом, любое имя буфера, возвращенный glCreateBuffers никогда не будет использоваться снова сам по себе, но может быть использован glGenBuffers.

Кажется, что glCreateBuffers всегда будет создавать новые объекты буфера и возвращать их имена, а glGenBuffers создаст новые буферы, если нет предыдущих буферов, которые с тех пор были удалены.

В чем преимущество добавления этой функции?

Когда следует использовать glCreateBuffers над glGenBuffers?


P.S.
Я думаю, что это стоит для всех glCreate* функций, добавленных GL_ARB_direct_state_access

+0

Говорят, что «каждый представляет новый буферный объект», другой говорит: «Объекты буфера не связаны с именами возвращаемых имен буфера». Вы говорите: «glGenBuffers будут создавать только новые буферы, если нет предыдущих буферов, которые с тех пор были удалены», но 'glGenBuffers' ** никогда не создадут новые буферы. –

+0

А, так вам никогда не нужно называть 'glBindBuffer', имеет смысл – CoffeeandCode

+0

@BenVoigt сделать ответ человеком, вот и все, что мне нужно. – CoffeeandCode

ответ

5

OpenGL 4.5 Спецификации - 6.1 Создания и Binding Buffer Objects:

Объект буфера создается путем связывания имени, возвращенное GenBuffers в буферного цель. Связывание осуществляется путем вызова

void BindBuffer (целевой объект перечисления, буфер uint);

Цель должна быть одной из указанных целей в таблице 6.1. Если буферный объект с именем buffer не был ранее отмечен , GL создает новый вектор состояния, инициализированный буфером памяти нулевого размера и содержащий все состояние и с теми же начальными значениями, перечисленными в таблице 6.2.

Таким образом, разница между glGenBuffers и glCreateBuffers в том, что glGenBuffers возвращает только неиспользуемое имя, в то время как glCreateBuffers также создает и инициализирует вектор состояния, описанный выше.


Использование:

Рекомендуется использовать glGenBuffers + glBindBuffer, потому что

ГЛ может сделать различные варианты о месте хранения и макета на основе первоначального связывания.

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

+8

"* Рекомендуется использовать glGenBuffers + glBindBuffer, потому что *" Нет. Как четко указано в расширении ARB_direct_state_access, * nobody * фактически заботится о том, как буфер первоначально связан. Именно поэтому 'glCreateBuffers' не принимает цель, а' glCreateTextures' делает. Поэтому ваша рекомендация не подходит. –

+0

@NicolBolas Я бы продвигал ваш комментарий к альтернативному ответу, потому что, в то время как ответ дари в основном верен, его замечание «Использование» сбивает с толку и, вероятно, основано на мнениях. –

11

Что вы здесь заметите, это в основном уборка API для обеспечения согласованности с созданием объектов Shader и Program. Они всегда генерировались и инициализировались одним вызовом и были единственной частью API, которая работала именно так. Каждый другой объект был зарезервирован сначала с использованием glGen* (...) и позже инициализирован путем привязки зарезервированного имени к цели.

Фактически, до GL 3.0 было разрешено полностью пропустить glGen* (...) и создать объект, просто привязав уникальный номер где-нибудь.

В GL 4.5 каждому типу объекта была присвоена функция glCreate* (...), которая генерирует и инициализирует их в одном вызове в GL 4.5. Эта методология прекрасно сочетается с Direct State Access, где изменение (в этом случае создание) объекта не требует изменения (и потенциального восстановления) состояния привязки.


Многие объекты требуют мишени (например, текстуры) при использовании API таким образом, но объекты буфера предназначены для всех намерений и целями Бестипового. Вот почему подпись API идентична. Когда вы создаете объект-буфер с этим интерфейсом, он равен «инициализирован, как если бы он был привязан к неопределенной цели». Это было бы полной бессмыслицей для большинства типов объектов в GL; им нужна цель, чтобы правильно их инициализировать.

Основное внимание здесь заключается в том, что вы можете создать и настроить состояние для объекта в GL, не затрагивая какой-либо другой фрагмент кода, который ожидает, что объект, привязанный к определенной цели, останется неизменным. Именно для этого был создан Direct State Access, и это основная причина, по которой эти функции существуют.

Теоретически, как указывает Дари, инициализация объекта-буфера путем привязки его к определенной цели потенциально дает подсказкам драйвера о его предполагаемом использовании. Я бы не стал вкладывать в это много акций, но это так же, как и фактические флаги использования при вызове glBufferData (...); намек в лучшем случае.

1

glCreateBuffers не имеет цели, потому что объекты буфера не печатаются. Первая цель привязки использовалась только как подсказка в OpenGL. И Хронос считается давая glCreateBuffers параметр target, но они решили против нее:

NamedBufferData (и соответствующую функцию из исходного EXT) не включают < целевой> параметр. Имеются ли в реализациях исходные предположения об использовании хранилища данных на основе этого параметра . Куда он пошел?Должны ли мы вернуть его?

ПОСТАНОВИЛИ: нет необходимости в целевом параметре для буфера. Implemetations [sic] не используют предположения использования на основе параметра цели <. Только один расширение поставщика делает так AMD_pinned_memory. A [sic] для согласованного подхода , чтобы указать использование буфера, было бы добавить новый флаг для этого флага <> параметра BufferStorage.

Акцент добавлен.