Я хотел бы создать изображение devIL из необработанных текстурных данных, но я не могу найти способ сделать это. Кажется, правильный путь — ilLoadL с IL_RAW, но я не могу заставить его работать. Документация в Вот говорит, что в данных должен быть 13-байтовый заголовок, поэтому я просто помещаю туда бессмысленные данные. Если я поставлю 0 в «размер» параметра ilLoadL,
Я получу черную текстуру, несмотря ни на что. В противном случае моя программа отказывается что-либо рисовать. ilIsImage возвращает true, и я могу создать из него текстуру openGL. Код работает, если я загружаю текстуру из файла.
Это немного, но вот мой код:
//Loading:
ilInit();
iluInit();
ILuint ilID;ilGenImages(1, &ilID);
ilBindImage(ilID);
ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);//Generate 13-byte header and fill it with meaningless numbers
for (int i = 0; i < 13; ++i){
data.insert(data.begin() + i, i);
}//This fails.
if (!ilLoadL(IL_RAW, &data[0], size)){
std::cout << "Fail" << std::endl;
}
Создание текстуры:
ilBindImage(ilId[i]);
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
glBindTexture(textureTarget, id[i]);
glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(textureTarget, GL_TEXTURE_MIN_FILTER, filters[i]);
glTexParameterf(textureTarget, GL_TEXTURE_MAG_FILTER, filters[i]);
glTexImage2D(textureTarget, 0, GL_RGBA,
ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT),
0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());
Если формат изображения имеет заголовок, вы можете предположить, что он содержит некоторую важную информацию, необходимую для правильного чтения остальной части файла. Заполнение его «бессмысленные данные» в лучшем случае не рекомендуется.
Поскольку нет актуального struct
в DevIL для .raw
заголовок, давайте посмотрим на реализацию iLoadRawInternal ()
чтобы выяснить, какими должны быть эти первые 13 байтов.
// Internal function to load a raw image
ILboolean iLoadRawInternal()
{
if (iCurImage == NULL) {
ilSetError(IL_ILLEGAL_OPERATION);
return IL_FALSE;
}
iCurImage->Width = GetLittleUInt(); /* Bytes: 0-3 {Image Width} */
iCurImage->Height = GetLittleUInt(); /* Bytes: 4-7 {Image Height} */
iCurImage->Depth = GetLittleUInt(); /* Bytes: 8-11 {Image Depth} */
iCurImage->Bpp = (ILubyte)igetc(); /* Byte: 12 {Bytes per-pixel} */
НОТА: /* comments */
мои собственные
GetLittleUInt ()
читает 32-разрядное целое число без знака в порядке с прямым порядком байтов и соответствующим образом перемещает место чтения. igetc ()
делает то же самое для одного байта.
struct RAW_HEADER {
uint32_t width;
uint32_t height;
uint32_t depth; // This is depth as in the number of 3D slices (not bit depth)
uint8_t bpp; // **Bytes** per-pixel (1 = Luminance, 3 = RGB, 4 = RGBA)
};
Если вы читаете остальную часть реализации iLoadRawInternal ()
в il_raw.c
, вы увидите, что без правильных значений в заголовке DevIL не сможет рассчитать правильный размер файла. Заполнение правильных значений должно помочь.