纹理在opengl中消失

时间:2013-12-02 17:27:31

标签: c++ opengl freeimage

我看到这个问题,在应用程序使用一两分钟后纹理消失了。为什么纹理会消失?三维立方体始终保留在屏幕上。纹理消失时纹理显示为白色框的位置。

我的DrawGLScene方法如下所示:

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
            glLoadIdentity();   // Reset The Current Modelview Matrix

            glTranslatef(0.0f, 0.0f, -7.0f);    // Translate Into The Screen 7.0 Units

//rotquad is a value that is updated as the user interacts with the ui by +/-9 to rotate the cube
        glRotatef(rotquad, 0.0f, 1.0f, 0.0f);

        //cube code here

            RECT desktop;
            const HWND hDesktop = GetDesktopWindow();
            GetWindowRect(hDesktop, &desktop);
            long horizontal = desktop.right;
            long vertical = desktop.bottom;

            glMatrixMode(GL_PROJECTION);
            glPushMatrix();
            glLoadIdentity();
            glOrtho(-5.0, 3, 3, -5.0, -1.0, 10.0);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            glDisable(GL_CULL_FACE);
            glEnable(GL_TEXTURE_2D);

            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

            glClear(GL_DEPTH_BUFFER_BIT);

            glColor4f(255.0f, 255.0f, 255.0f, 0.0f);
            if (hoverRight) {
                imageLoaderOut(outImage);
                imageLoaderIn(inImage);
                imageLoaderUp(upImage);
                imageLoaderLeft(leftHover);
                imageLoaderDown(upImage);
                imageLoaderRight(rightImage);
            }
    // code for hover left, up and down are the same as hover right code above 

        glDisable(GL_TEXTURE_2D);
        return TRUE;    // Keep Going
    }

这个方法是imageLoad方法之一(被调用的其他方法几乎相同,除了位置/位置..

        void imageLoaderOut(const char* value)
        {
            FIBITMAP* bitmap60 = FreeImage_Load(
                FreeImage_GetFileType(value, 0),
                value, PNG_DEFAULT);
            FIBITMAP *pImage60 = FreeImage_ConvertTo32Bits(bitmap60);
            int nWidth60 = FreeImage_GetWidth(pImage60);
            int nHeight60 = FreeImage_GetHeight(pImage60);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth60, nHeight60, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage60));
            FreeImage_Unload(pImage60);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
            glBegin(GL_QUADS);
            glTexCoord2f(0.0f, 0.0f); glVertex2f(2.8f, -1.1f); // moves BOTTOM EDGE UP or DOWN - stretches length of image
            glTexCoord2f(0.0f, 1.0f); glVertex2f(2.8f, -1.9f);
            glTexCoord2f(1.0f, 1.0f); glVertex2f(2.1f, -1.9f);
            glTexCoord2f(1.0f, 0.0f); glVertex2f(2.1f, -1.1f); // moves BOTTOM EDGE UP or DOWN - stretches length of image
            glEnd();
        }

2 个答案:

答案 0 :(得分:2)

问题似乎出现在glTexImage2D中。手册可在此处找到:http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml

他们特别说:

  

glTexImage2D指定当前纹理单元的二维纹理,使用glActiveTexture指定。

一旦多次致电glTexImage2D,您似乎会覆盖同一位置的倍数。

答案 1 :(得分:2)

这只是一个猜测,但是你的代码中存在严重的设计问题,加上内存泄漏,可能会导致你所描述的未定义结果。

首先,在imageLoaderOut()中,您正在从HDD中读取每帧的所有纹理,将其转换为32 bpp并将数据发送到OpenGL。你从DrawGLScene调用它,这意味着你每帧都这样做。做事真是无效的方式。您不需要每帧加载资源。如果Initialize()起作用,可以在某种情况下一劳永逸地完成,并且只需在绘图时使用GL资源。

然后,我认为你有内存泄漏,因为你永远不会卸载bitmap60。当您加载每个帧时,可能每秒数千次,这个未释放的内存会累积。所以,经过一段时间后,事情变得非常糟糕,FreeImage拒绝加载纹理。

所以,可能的解决办法是:

  • 将资源加载移至应用程序的初始化阶段
  • 免费泄露资源:每个加载函数中的FreeImage_Unload(bitmap60)

希望它有所帮助。