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 纹理映射错误的主要内容,如果未能解决你的问题,请参考以下文章

FBO:渲染到纹理,绘制渲染纹理时纹理映射错误

OpenGL 4.3错误地将第4个纹理坐标映射到与第3个纹理坐标相同的位置

opengl 把纹理映射到立方体的六个面。

OpenGL纹理映射总结

opengl使用bmp纹理映射画不出东西

Opengl 纹理映射和图像分辨率