我在尝试使用DevIL加载图像并在OpenGL中创建纹理时遇到了一些问题。当我的一个朋友在他的Windows上测试我的程序时,所有应该包含纹理的rects都是白色的,没有任何图像(纹理)。问题似乎只发生在Window XP,Windows Vista和Windows 7上,但不是每台Windows PC都出现:我的Windows XP运行程序没有问题。
可能存在一些丢失的DLL或文件(不太可能),或者某些不允许将图像加载或用作纹理的东西。另一方面,该程序在* UNIX系统上运行良好。
这是我用来加载图像并生成纹理的代码:
void Image::load(const char* filename)
{
ILuint ilimg;
ilGenImages(1, &ilimg);
ilBindImage(ilimg);
if (!ilLoadImage(filename))
throw ImageLoadError;
glGenTextures(1, &image);
glBindTexture(GL_TEXTURE_2D, image);
bpp = ilGetInteger(IL_IMAGE_BPP);
width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);
format = ilGetInteger(IL_IMAGE_FORMAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, bpp, width, height, 0, format,
GL_UNSIGNED_BYTE, ilGetData());
ilDeleteImages(1, &ilimg);
}
这是使用纹理绘制矩形的代码:
void Rect::show()
{
glPushAttrib(GL_CURRENT_BIT);
glEnable(GL_TEXTURE_2D);
glColor4f(1.0, 1.0, 1.0, opacity);
glBindTexture(GL_TEXTURE_2D, texture->get_image());
glBegin(GL_POLYGON);
glTexCoord2i(0, 0); glVertex2f(x, y);
glTexCoord2i(1, 0); glVertex2f(x+width, y);
glTexCoord2i(1, 1); glVertex2f(x+width, y+height);
glTexCoord2i(0, 1); glVertex2f(x, y+height);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopAttrib();
}
如果您需要其他我未提及的代码,请问我,我会发布。
答案 0 :(得分:0)
glTexImage2D(target, level, internal format, width, height, border, format, type, data);
glTexImage的内部格式参数不是每像素位数。实际上它的数值与格式完全无关。 OpenGL仅定义了有效的特定值,其中还有4个具有数字关系,但仅作为助记符:1(GL_LUMINANCE的简写),2(GL_LUMINANCE_ALPHA),3(GL_RGB),4(GL_RGBA)。还有许多其他格式标记,但它们的数值是任意选择的。
此外,图像数据的bpp用于查找格式和类型参数。您需要为此实现LUT或switch-case结构。
答案 1 :(得分:-1)
您遇到的问题听起来像是实施版本问题。可能一个“正确”但不那么“好”的实现并不会让你侥幸失误。或者另一方面,实现可能有一个微妙的错误,并且不接受您的有效代码。
我可能会尝试交换
glColor4f(1.0, 1.0, 1.0, opacity);
glBindTexture(GL_TEXTURE_2D, texture->get_image());
到
glBindTexture(GL_TEXTURE_2D, texture->get_image());
glColor4f(1.0, 1.0, 1.0, opacity);
并在texcoord之前声明顶点。
glVertex2f(x, y);
glTexCoord2i(0, 0);
如果您还没有“红皮书”,请参阅http://glprogramming.com/red/chapter09.html