OpenGL纹理映射错误

时间:2010-08-05 19:10:26

标签: c++ opengl

这是我项目的一个大问题:

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

我意识到我的glaux.h失踪了。我在Internet上找到了该文件并重新编译了我的项目,但它仍然崩溃了。当我排除纹理函数时,一切顺利。

问题在哪里,我该怎么做才能解决问题?

我在想其中一个是罪魁祸首: 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;
}

这对我来说非常明显。

4 个答案:

答案 0 :(得分:1)

因为它在免费通话中崩溃,请检查

  • 你不是双重释放指针。
  • 你有任何有效的指针。这意味着使用malloc分配的自由指针,你不能释放用new获得的指针。此外,您必须释放从分配函数获得的原始指针值,而不是指针+ 1或其上的一些算术。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是否在未重新编译的库中分配(使用malloc)内存,然后在新编译的代码中释放?不同的编译器/ OS组合使用不同的堆,因此在不同情况下编译的两个库之间不匹配的malloc / free可能会导致崩溃(或其他一些UB)。

具体来说,您确定自重新安装以来是否正在编译LoadBMP()的实现?

答案 3 :(得分:0)

案件结案:

我正在编辑我的位图(NeHe lesson7的Crate.bmp),当时我意识到我在其上绘制的颜色显示不正确。在创建一个新的24位位图并在其上标记颜色后,白色背景变为橙色,但这是因为我之前的glColor3f()调用。我添加了一个glColor3f(1.0f,1.0f,1.0f)调用并注释掉了那段代码中的free(),并且一切都变得膨胀。