Я пытаюсь загрузить изображение, которое я сохранил как большой массив неподписанных символов. В частности, массив структур из неподписанных символов
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. Любой совет будет принята с благодарностью.
Первый метод экспорта изображения в качестве пригодных для использования исходных данных действительно работает, моя проблема была в моей кодовой базе Visual Studio. Я забыл установить параметры текстуры в моем «жестко закодированном» методе загрузки.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Спасибо, что напомнили мне в комментариях, дерхасс.
Других решений пока нет …