【问题标题】:How to load devIL image from raw data如何从原始数据加载 devIL 图像
【发布时间】:2014-12-23 06:07:13
【问题描述】:

我想从原始纹理数据创建 devIL 图像,但我似乎找不到方法。正确的方法似乎是带有 IL_RAW 的 ilLoadL,但我无法让它工作。 here 中的文档说数据中应该有 13 字节的标头,所以我只是将无意义的数据放在那里。如果我将 0 设置为 ilLoadL 的“size”参数, 无论如何,我都会得到黑色纹理。否则我的程序拒绝绘制任何东西。 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());

【问题讨论】:

    标签: c++ opengl vector textures devil


    【解决方案1】:

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

    由于在 DevIL 中对于 .raw 标头没有实际的 struct,让我们看一下 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)
    };
    

    如果你在il_raw.c 中阅读了iLoadRawInternal () 的其余实现,你会发现没有正确的头部值,DevIL 将无法计算正确的文件大小。填写正确的值应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多