OpenGL纹理映射错误

3

我的项目有一个大问题:

我喜欢NeHe网站上的教程,Windows XP可以完美运行程序。但是,当我重新格式化电脑,将操作系统更改为Windows Vista并重新安装Dev-C++编译器后,尝试打开任何使用纹理的C++程序时,程序崩溃了。

我发现我的glaux.h文件丢失了。我在互联网上找到了这个文件并重新编译了我的项目,但它仍然崩溃了。当我排除纹理函数时,一切都顺利。

问题出在哪里?我该怎么解决?

我想这其中有一个罪魁祸首:

Windows Vista操作系统、我的显卡、glaux.h和库(我知道它有漏洞)、OpenGL本身。

.

更新:我确定了问题的来源。

这段代码导致我的程序崩溃:

if (TextureImage[0]) {
    if (TextureImage[0]->data) {    
    free(TextureImage[0]->data);
    }
    free(TextureImage[0]);
}

由于某些原因,每当我让程序释放内存时,它总是崩溃。当我注释掉这一部分时,我的程序可以正常工作,只是颜色变深了(我想这是由于位图文件的颜色)。有什么建议吗?
回复Matias Valdenegro:
好吧,这是从NeHe lesson6导出的,在我还使用Windows XP时运行良好。当我切换到Windows Vista时,绝对没有任何更改。
只是让你知道,这是整个函数:
#define NoOfTextures 3
GLuint  texture[NoOfTextures];

int LoadGLTextures()
{
    int Status=FALSE;

    AUX_RGBImageRec *TextureImage[NoOfTextures];

    memset(TextureImage,0,sizeof(void *)*1);

    if (TextureImage[0]=LoadBMP("Data/Bitmaps/texture.bmp"))
    {
        Status=TRUE;

        glGenTextures(1, &texture[0]);

        glBindTexture(GL_TEXTURE_2D, texture[0]);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

        if (TextureImage[0] != NULL) {  
            if (TextureImage[0]->data != NULL) {    
                free(TextureImage[0]->data);
            }
            free(TextureImage[0]);  
        }
    }

    return Status;                                      
}

附加信息:

我经常重新构建我的项目,LoadBMP()是同一个头文件的一部分。这是LoadBMP()函数:

AUX_RGBImageRec *LoadBMP(char *Filename)
{
    FILE *File=NULL;

    if (!Filename)
    {
        return NULL;
    }

    File=fopen(Filename,"r");

    if (File)
    {
        fclose(File);
        return auxDIBImageLoad(Filename);
    }

    return NULL;
}

这对我来说似乎非常明确。

它在哪里崩溃了?使用调试器找出来。 - Dr. Snoopy
更新__图形驱动程序到最新版本__,并发布程序崩溃的代码行。 - SigTerm
你能发布LoadBMP函数吗?检查它是否正确分配内存。 - Dr. Snoopy
4个回答

1

由于在free调用中崩溃,请检查:

  • 您是否重复释放指针。
  • 您是否有有效的指针。这意味着释放使用malloc分配的指针,您不能释放使用new获取的指针。此外,您必须释放从分配函数获得的原始指针值,而不是指针+1或对其进行某些算术运算。

0
我猜测这与文件权限有关。尝试将项目文件权限设置为较低级别(特别是纹理文件)。我在过去的不同项目中也遇到过这种情况,当我从XP切换到Vista或Win7时,会在运行时加载资源。

0

你是否在一个未重新编译的库中分配了内存(使用malloc),然后在新编译的代码中释放了它?不同的编译器/操作系统组合会以不同的方式使用堆,因此在不同情况下编译的两个库之间的不匹配的malloc/free可能会导致崩溃(或其他未定义行为)。

具体来说,在重新安装后,你确定正在编译LoadBMP()的实现吗?


0

问题解决:

我正在编辑我的位图(NeHe lesson7的Crate.bmp),当我意识到我涂上去的颜色显示不正确。创建一个新的24位位图并在其上标记颜色后,白色背景变成了橙色,但这是由于我之前的glColor3f()调用。我添加了一个glColor3f(1.0f, 1.0f, 1.0f)调用,并注释掉了代码中带有free()的部分,一切都很顺利。


我还必须在程序末尾加载一个“空白”纹理(白色位图)以进行颜色校正。 - EoS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接