我想从原始纹理数据创建devIL图像,但我似乎无法找到一种方法。正确的方式似乎是ilLoadL与IL_RAW,但我不能让它工作。 here中的文档说数据中应该有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());
答案 0 :(得分: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 ()
对单个字节执行相同的操作。
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将无法计算正确的文件大小。填写正确的值应该会有所帮助。