我看到这个问题,在应用程序使用一两分钟后纹理消失了。为什么纹理会消失?三维立方体始终保留在屏幕上。纹理消失时纹理显示为白色框的位置。
我的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 :(得分: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)
希望它有所帮助。