0

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

我的 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();
        }
4

2 回答 2

2

问题似乎出在glTexImage2D. 该手册可以在这里找到:http ://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml

他们特别指出:

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

一旦您glTexImage2D多次调用,您似乎会多次覆盖相同的位置。

于 2013-12-02T17:35:06.603 回答
2

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

首先,imageLoaderOut()您正在从 HDD 读取每一帧的所有纹理,将其转换为 32 bpp 并将数据发送到 OpenGL。您从 调用它DrawGLScene,这意味着您每帧都执行此操作。这确实是一种无效的做事方式。您不需要每帧加载资源。以某种 if 函数一劳永逸地完成它Initialize(),并在绘图时使用 GL 资源。

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

因此,可能的解决方案是:

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

希望能帮助到你。

于 2013-12-02T18:29:15.813 回答