glGenBuffers vs glGenTextures - PullRequest
       8

glGenBuffers vs glGenTextures

0 голосов
/ 20 февраля 2019

Какая разница между glGenBuffers и glGenTextures?Я заметил, что оба прекрасно работают, когда я пытаюсь сгенерировать текстуру:

int texture1 = GL30.glGenBuffers();
GL30.glBindTexture(GL30.GL_TEXTURE_2D,texture1);

int texture2 = GL30.glGenTextures();
GL30.glBindTexture(GL30.GL_TEXTURE_2D,texture2);

Оба эти параметра, похоже, ведут себя одинаково для меня.Есть ли преимущество использования glGenTextures над glGenBuffers?И если нет, то почему glGenTextures существует, когда вместо него можно просто использовать glGenBuffers?

1 Ответ

0 голосов
/ 20 февраля 2019

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

Обратите внимание, что буферный объект и объект текстуры могут иметь одно и то же значение, но есть 2 совершенно разных объекта.Имя, которое возвращается glGenBuffers, не помечается как использованное (или зарезервированное) для используемого в качестве объекта текстуры, но оно зарезервировано для использования в качестве объекта буфера.

OpenGL ES 3.2 Спецификация -8.1. Объекты текстуры;страница 140

Команда

void GenTextures( sizei n, uint *textures );

возвращает n ранее неиспользуемых имен текстур в текстурах.Эти имена помечены как использованные для целей GenTextures только , но они приобретают текстурное состояние и размерность только при первом связывании, как если бы они не использовались.

Спецификация OpenGL ES 3.2 - 6 буферных объектов;стр. 50

Команда

void GenBuffers( sizei n, uint *buffers );

возвращает n ранее неиспользуемых имен объектов буфера в буферах.Эти имена помечены как использованные для целей GenBuffers только , но они приобретают состояние буфера только тогда, когда они впервые связаны с BindBuffer (см. Ниже), как если бы они не использовались.


Обратите внимание, что спецификация OpenGL ES здесь отличается от (основной) спецификации профиля ядра OpenGL.В (настольном) профиле ядра OpenGL недопустимо передавать значение в glBindTexture, которое не было возвращено glGenTexture.

См. Спецификация профиля ядра API OpenGL 4.6 - 8.1 Текстурные объекты;стр. 180

Привязка осуществляется путем вызова

void BindTexture( enum target, uint texture );

[...]

Ошибки
[...]
Ошибка INVALID_OPERATION генерируется, если текстура не равна нулю или имя возвращено из предыдущего вызова GenTextures, или если такое имя с тех пор было удалено.

...