2010-08-05 222 views
3

下面是我的项目中的一个BIG问题:OpenGL纹理映射错误

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

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

问题在哪里,我能做些什么来解决它?

我在想这些之一是罪魁祸首: Windows Vista操作系统,我的图形卡,glaux.h和库(我知道它有bug),OpenGL本身。

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

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

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

出于某种原因,我的程序老是死机时,我就以释放内存。当我评论这部分时,我的程序运行正常,除了所有的颜色都变黑(我想这是因为我的位图文件的颜色)。有小费吗?

回复:马蒂亚斯Valdenegro

好了,这是从讷河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; 
} 

这对我来说似乎很清楚。

+0

它在哪里崩溃?使用调试器来查找。 – 2010-08-05 19:18:23

+0

将__ *图形驱动程序更新到最新版本* __,并发布程序崩溃的代码行。 – SigTerm 2010-08-05 19:19:32

+0

你可以发布LoadBMP功能吗?检查它是否正确分配内存。 – 2010-08-05 21:06:26

回答

0

结案:

我编辑我的位图(讷河lesson7的Crate.bmp),当我意识到我画上也没有显示正确的颜色。创建一个新的24位位图并在其上标记颜色后,白色背景变为橙色,但这是因为我之前的glColor3f()调用。我添加了一个glColor3f(1.0f,1.0f,1.0f)调用,并在其中使用free()注释掉了这段代码,并且所有内容都膨胀了。

+0

我还必须在程序结束时加载一个“空白”纹理(白色位图)以进行颜色校正。 – EoS 2010-08-12 14:13:23

0

我猜它必须处理文件权限。尝试将项目的文件权限设置为较低级别(特别是您的纹理)。过去发生在我身上的是不同的项目,这些项目在运行时加载资产,当时我从XP切换到Vista或Win7。

1

因为它在一个自由的调用都崩溃了,检查

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

内存被分配(与malloc)在库中,你不重新编译,然后在新编译的代码中释放?不同的编译器/操作系统组合使用堆的方式不同,所以在不同情况下编译的两个库之间的malloc/free不匹配可能会导致崩溃(或其他一些UB)。

具体而言,你确定自从重新安装以来编译LoadBMP()的实现吗?