1

我在尝试使用 DevIL 加载图像并在 OpenGL 中创建纹理时遇到了一些问题。当我的一个朋友在他的 Windows 上测试我的程序时,所有应该包含纹理的矩形都是白色的,没有任何图像(纹理)。这个问题似乎只出现在 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();
}

如果您需要我未提及的其他代码,请询问我,我会发布它。

4

2 回答 2

0
glTexImage2D(target, level, internal format, width, height, border, format, type, data);

glTexImage的内部格式参数不是每像素位数。实际上它的数值与格式完全无关。OpenGL只定义了特定的值是有效的,其中也有四个数字关系,但只是作为助记符:1(GL_LUMINANCE的简写),2(GL_LUMINANCE_ALPHA),3(GL_RGB),4(GL_RGBA)。还有许多其他格式标记,但它们的数值是任意选择的。

图像数据的 bpp 也用于查找格式类型参数。您需要为此实现 LUT 或 switch-case 结构。

于 2010-12-21T01:01:13.263 回答
-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

于 2010-12-21T00:20:31.490 回答