текстуры исчезают в OpenGL

Я вижу эту проблему, когда текстуры исчезают после того, как приложение используется в течение минут или двух. почему текстуры исчезают? 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();
}

0

Решение

Это просто предположение, но у вас есть серьезная проблема с дизайном в вашем коде, в сочетании с утечкой памяти, которая может привести к таким неопределенным результатам, как вы описали.

Первый в imageLoaderOut() Вы читаете все текстуры каждого кадра с жесткого диска, конвертируете его в 32 bpp и отправляете данные в OpenGL. Вы звоните из DrawGLScene, что означает, что вы делаете это каждый кадр. Это действительно неверный способ делать вещи. Вам не нужно загружать ресурсы каждый кадр. Сделай это раз и навсегда в некотором роде, если Initialize() функция, и просто использовать ресурс GL на рисунке.

Тогда, я думаю, что здесь у вас утечка памяти, потому что вы никогда не выгружаете bitmap60, По мере загрузки каждого кадра, возможно, тысячи раз в секунду, эта неизданная память накапливается. Итак, через некоторое время что-то идет очень плохо и FreeImage отказывается загружать текстуры.

Итак, возможное решение:

  • переместить загрузку ресурсов в фазу инициализации вашего приложения
  • бесплатные просочившиеся ресурсы: FreeImage_Unload(bitmap60) в каждой функции загрузки

Надеюсь, поможет.

2

Другие решения

Проблема, кажется, в glTexImage2D, Руководство можно найти здесь: http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml

В частности, они сказали, что:

glTexImage2D указывает двумерную текстуру для текущего текстурного блока, указанного с помощью glActiveTexture.

Как только вы звоните glTexImage2D несколько раз, кажется, что вы перезаписываете одно и то же местоположение, многократно.

2

По вопросам рекламы [email protected]