Как загрузить изображение devIL из необработанных данных

Я хотел бы создать изображение devIL из необработанных текстурных данных, но я не могу найти способ сделать это. Кажется, правильный путь - ilLoadL с IL_RAW, но я не могу заставить его работать. Документация здесь говорит о том, что в данных должен быть 13-байтовый заголовок, поэтому я просто помещаю туда бессмысленные данные. Если я установлю 0 для параметра "size" 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());

1 ответ

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

Поскольку нет актуального 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 () делает то же самое для одного байта.

Это эквивалентно следующей структуре C (за вычетом порядка следования байтов):

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 не сможет рассчитать правильный размер файла. Заполнение правильных значений должно помочь.

Другие вопросы по тегам