Как загрузить жестко запрограммированное изображение в текстуру OpenGL - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь загрузить изображение, которое я сохранил как большой массив неподписанных символов. В частности, массив структур из неподписанных символов

typedef struct {
    unsigned char
        r,
        g,
        b;
}RGB;

Данные самого изображения экспортируются из gimp в виде очень большого исходного файла c, который выглядит примерно так

RGB Image[25000]={
    {0,0,0},{0,0,0},{0,0,0},{174,174,174},{175,175,175},{177,177,177},
    {180,180,180},{183,183,183},{187,187,187},{192,192,192},{196,196,196},
    {202,202,202},{207,207,207},{213,213,213},{239,239,239},
    ...
}

У меня есть ширина изображения, высота и я знаю, что это в 8-битном формате RGB. Я пытаюсь передать его в glTexImage2D, но он всегда отображает весь черный.

Скажите что-то вроде

unsigned int imageWidth = 960;
unsigned int imageHeight = 540;

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth, imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, &Image);

Проблема не в моем шейдерном коде или в другом месте программы, так как все работает, если я загружаю текстуру из файла. Я просто не знаю, можно ли считать эти данные как есть, или мне нужно как-то их подготовить, или что-то еще, я новичок в openGL.

Моя цель - встроить в приложение несколько текстур, чтобы их нельзя было легко заменить или изменить. Я использую плагины Gimp для экспорта текстуры в исходный код. Есть еще один плагин для экспорта Gimp, который предоставляет исходные тексты для моего компилятора gcc / g ++, но когда я пытаюсь скомпилировать из Visual Studio, он жалуется, что строка слишком длинная

ограничение компилятора: длина строки превышает 65535 байт

Однако работает на gcc / g ++. В этом случае источник выглядит так

static const struct Image{
  unsigned int       width;
  unsigned int       height;
  unsigned int       bytes_per_pixel; /* 2:RGB16, 3:RGB, 4:RGBA */ 
  unsigned char      pixel_data[960 * 540 * 4 + 1];
} ImageImage = {
  960, 540, 4,
  "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
  "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
  "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
  "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
  "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
  "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
  "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
  "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
...
}

Это работает на gcc / g ++, но visual studio жалуется. Это действительно очень длинный файл, так что я не удивлюсь, но это настоящий облом, я не могу заставить его работать. Я попытался разобрать его, превратив каждую строку максимального предела в std :: string и передавая каждый неподписанный символ из вектора в вектор без знака, что, как я знаю, не следует делать, но я цепляюсь за соломинку в эта точка

std::vector<unsigned char> _charVec;
std::string tempString = "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
      "\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000"
      "\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000"
      "\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377"
      "\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000\000\000\377\000"
...
_charVec.insert(_charVec.end(), tempString.begin(), tempString.end());

это не сработает. Он останавливает ошибку компилятора, но вызывает сбой, когда я пытаюсь получить доступ к любому объекту класса, в котором хранятся данные, или передать контейнер другому методу.

У меня нет другого способа конвертировать мои текстуры в источник, и есть один или два, которые я бы определенно предпочел не распространять в сыром виде, поэтому я бы хотел, чтобы один из этих двух источников текстур загружался в openGL. Первый исходный формат, вероятно, мне понадобится, пока я создаю с помощью Visual Studio, так как он не может обрабатывать длинные строки во втором методе, и попытка заполнить векторы или массивы из него выглядит более дополнительные шаги, чем необходимо. Я, наверное, все об этом ошибаюсь, так как еще не очень знаком с нюансами openGL. Любой совет будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 мая 2018

Первый способ экспорта изображения в качестве пригодных для использования исходных данных действительно работает, моя проблема была в моей кодовой базе Visual Studio. Я забыл установить параметры текстуры в моем «жестко закодированном» способе загрузки

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

Спасибо, что напомнили мне в комментариях, дерхасс.

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