gpt4 book ai didi

c++ - 如何从原始数据加载 devIL 图像

转载 作者:行者123 更新时间:2023-11-28 02:35:29 26 4
gpt4 key购买 nike

我想从原始纹理数据创建 devIL 图像,但我似乎找不到实现它的方法。正确的方法似乎是 ilLoadL with IL_RAW,但我无法让它工作。 here 中的文档说数据中应该有 13 字节的 header ,所以我只是把无意义的数据放在那里。如果我将 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());

最佳答案

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

由于.raw头在DevIL中没有实际的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.ciLoadRawInternal () 的其余实现,您会发现如果 header 中没有正确的值,DevIL 将无法计算正确的文件大小。填写正确的值应该会有所帮助。

关于c++ - 如何从原始数据加载 devIL 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27609152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com