这是我项目的一个大问题:
我喜欢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;
}
这对我来说非常明显。
答案 0 :(得分: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(),并且一切都变得膨胀。