Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL纹理映射错误_C++_Opengl - Fatal编程技术网

C++ OpenGL纹理映射错误

C++ OpenGL纹理映射错误,c++,opengl,C++,Opengl,我的项目有一个大问题: 我喜欢NeHe网站上的教程,Windows XP完美地运行了这些程序。然而,当我重新格式化我的计算机时,把OS改为Windows Vista,重新安装了我的DEV-C++编译器,然后我尝试打开任何使用纹理的C++程序,程序崩溃了。 我意识到我的glaux.h失踪了。我在互联网上找到了这个文件并重新编译了我的项目,但它仍然崩溃了。排除纹理函数后,一切都进行得很顺利 问题出在哪里?我能做些什么来解决它 我想其中一个就是罪魁祸首: WindowsVista操作系统,我的图形卡,

我的项目有一个大问题:

我喜欢NeHe网站上的教程,Windows XP完美地运行了这些程序。然而,当我重新格式化我的计算机时,把OS改为Windows Vista,重新安装了我的DEV-C++编译器,然后我尝试打开任何使用纹理的C++程序,程序崩溃了。 我意识到我的glaux.h失踪了。我在互联网上找到了这个文件并重新编译了我的项目,但它仍然崩溃了。排除纹理函数后,一切都进行得很顺利

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

我想其中一个就是罪魁祸首: WindowsVista操作系统,我的图形卡,glaux.h和库(我知道它有漏洞),OpenGL本身

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

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

if (TextureImage[0]) {
    if (TextureImage[0]->data) {    
    free(TextureImage[0]->data);
    }
    free(TextureImage[0]);
}
出于某种原因,每当我命令程序释放内存时,它总是崩溃。当我注释掉这一部分时,我的程序运行良好,只是所有颜色都变暗了(我想这是因为位图文件的颜色)。有什么建议吗

答复:Matias Valdenegro

嗯,这是从NeHe lesson6中衍生出来的,当我仍然使用Windows XP时,它工作得很好。当我切换到WindowsVista时,一切都没有改变

正如您所知,以下是整个函数:

#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;                                      
}
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()是同一头文件的一部分。这是LoadBMP()函数:

#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;                                      
}
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;
}

这对我来说似乎非常明确。

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

当它在免费调用中崩溃时,请检查

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

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

具体来说,您确定在重新安装后正在编译LoadBMP()的实现吗?

案例结束:


我正在编辑我的位图(NeHe lesson7's Crate.bmp),这时我意识到我在上面画的颜色显示不正确。创建新的24位位图并在其上标记颜色后,白色背景变为橙色,但这是因为我以前的glColor3f()调用。我添加了一个glColor3f(1.0f,1.0f,1.0f)调用,并用free()注释掉了这段代码,然后一切都变好了。

它在哪里崩溃?使用调试器找出问题所在。将图形驱动程序更新为最新版本,并发布程序崩溃的代码行。是否可以发布LoadBMP函数?检查它是否正确分配内存。我还必须在程序结束时加载一个“空白”纹理(白色位图)进行颜色校正。