0

我想从原始纹理数据创建 devIL 图像,但我似乎无法找到一种方法来做到这一点。正确的方法似乎是带有 IL_RAW 的 ilLoadL,但我无法让它工作。这里的文档说数据中应该有 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());
4

1 回答 1

2

如果图像格式有标题,您通常可以假设它包含正确读取文件其余部分所需的一些重要信息。用“无意义的数据”填充它充其量是不可取的。

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 ()以 little-endian 顺序读取 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 ()如果你阅读了in的其余实现il_raw.c,你会发现如果头文件中没有正确的值,DevIL 将无法计算正确的文件大小。填写正确的值应该会有所帮助。

于 2014-12-22T22:07:13.907 回答