Неинициализированная текстура в OpenGL

#opengl #textures

#opengl #Текстуры

Вопрос:

Существует ли простой и быстрый способ создать неинициализированную текстуру в OpenGL?

Мой текущий подход выглядит следующим образом:

 std::vector<byte> nothing = std::vector<byte>([size of texture in bytes]);
glTexImage(
   target,
   level,
   internalFormat,
   size,
   border,
   format,
   type,
   nothing
   );
  

но это не предполагает загрузки ничего.

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

Есть ли хороший способ создать текстуру, которая будет записана позже, без использования пропускной способности или дополнительной памяти?

Ответ №1:

Просто передайте нулевой указатель для данных. Именно так она задается в OpenGL начиная с версии 1. Из спецификации OpenGL 1.2, раздел 3.8.1, страница 118, последний абзац:

Если аргумент data TexImage1D, texImage2D или TexImage3D является нулевым указателем (указатель с нулевым значением в реализации C), создается одно-, двух- или трехмерный массив текстур с указанными target, level, internalformat, width, height и depth, но с неуказанным содержимым изображения. В этом случае доступ к значениям пикселей в памяти клиента невозможен, и обработка пикселей не выполняется. Однако ошибки генерируются точно так, как если бы указатель на данные был действительным.

Комментарии:

1. вау … кто бы мог подумать, что я просто не знал этого? Документы по opengl.org ничего не говорят об этом, не так ли? Не могли бы вы, пожалуйста, указать мне на конкретный текст, где это упоминается?

2. Ах, спасибо. Я просматривал документы и несколько форумов, но не заглядывал в спецификацию