Я вижу эту проблему, когда текстуры исчезают после того, как приложение используется в течение минут или двух. почему текстуры исчезают? 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();
}
Это просто предположение, но у вас есть серьезная проблема с дизайном в вашем коде, в сочетании с утечкой памяти, которая может привести к таким неопределенным результатам, как вы описали.
Первый в imageLoaderOut()
Вы читаете все текстуры каждого кадра с жесткого диска, конвертируете его в 32 bpp и отправляете данные в OpenGL. Вы звоните из DrawGLScene
, что означает, что вы делаете это каждый кадр. Это действительно неверный способ делать вещи. Вам не нужно загружать ресурсы каждый кадр. Сделай это раз и навсегда в некотором роде, если Initialize()
функция, и просто использовать ресурс GL на рисунке.
Тогда, я думаю, что здесь у вас утечка памяти, потому что вы никогда не выгружаете bitmap60
, По мере загрузки каждого кадра, возможно, тысячи раз в секунду, эта неизданная память накапливается. Итак, через некоторое время что-то идет очень плохо и FreeImage отказывается загружать текстуры.
Итак, возможное решение:
FreeImage_Unload(bitmap60)
в каждой функции загрузкиНадеюсь, поможет.
Проблема, кажется, в glTexImage2D
, Руководство можно найти здесь: http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
В частности, они сказали, что:
glTexImage2D указывает двумерную текстуру для текущего текстурного блока, указанного с помощью glActiveTexture.
Как только вы звоните glTexImage2D
несколько раз, кажется, что вы перезаписываете одно и то же местоположение, многократно.