OpenGL 纹理映射错误
Posted
技术标签:
【中文标题】OpenGL 纹理映射错误【英文标题】:OpenGL Texture Mapping Error 【发布时间】:2010-08-05 19:10:26 【问题描述】:这是我的项目的一个大问题:
我喜欢 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 第 6 课,当我还在使用 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;
这对我来说似乎很明确。
【问题讨论】:
它在哪里崩溃?使用调试器找出答案。 将图形驱动程序更新到最新版本,并发布程序崩溃的代码行。 你能发布LoadBMP函数吗?检查它是否正确分配内存。 【参考方案1】:由于它在免费通话中崩溃,请检查
你没有双重释放指针。 您在任何地方都有有效的指针。这意味着使用 malloc 分配的空闲指针,您不能释放使用 new 获得的指针。此外,您必须释放从分配函数中获得的原始指针值,而不是指针 + 1 或一些算术运算。【讨论】:
【参考方案2】:我猜这与文件权限有关。尝试将项目的文件权限设置为较低级别(特别是您的纹理)。过去在我从 XP 切换到 Vista 或 Win7 时,在运行时加载资产的不同项目中也发生过这种情况。
【讨论】:
【参考方案3】:内存是否在您未重新编译的库中分配(使用 malloc),然后在新编译的代码中释放?不同的编译器/操作系统组合使用堆的方式不同,因此在不同情况下编译的两个库之间的 malloc/free 不匹配可能会导致崩溃(或其他一些 UB)。
具体来说,您确定在重新安装后正在编译 LoadBMP() 的实现吗?
【讨论】:
【参考方案4】:结案:
我正在编辑我的位图(NeHe 第 7 课的 Crate.bmp)时,我意识到我在其上绘制的颜色显示不正确。创建一个新的 24 位位图并在其上标记颜色后,白色背景变为橙色,但这是由于我之前的 glColor3f() 调用。我添加了一个 glColor3f(1.0f, 1.0f, 1.0f) 调用,并用 free() 注释掉了那段代码,一切顺利。
【讨论】:
我还必须在程序结束时加载一个“空白”纹理(白色位图)以进行颜色校正。以上是关于OpenGL 纹理映射错误的主要内容,如果未能解决你的问题,请参考以下文章