【发布时间】:2011-06-09 03:08:44
【问题描述】:
根据 OpenGL 文档,
3.1 glutMainLoop
glutMainLoop 进入 GLUT 事件处理循环。
用法
void glutMainLoop(void);
说明 glutMainLoop 进入 GLUT 事件处理循环。该例程在 GLUT 程序中最多应调用一次。一旦被调用,这个例程将永远不会返回。它会根据需要调用任何已注册的回调。
所以每当调用 glutMainLoop() 时,它永远不会返回。结果,分配后我无法释放内存。
我的问题是:
我需要从文件中加载图像,本书(Superbible 4th edition)的解决方案是将这个加载文件例程放在绘图函数中。但是,我意识到这种方法过于昂贵,因为需要多次打开和关闭文件。我在学习 B-tree 的数据结构课上回忆,访问外部资源的成本是相当可观的,所以我尽量避免。
所以我的替代解决方案是将这个加载图像例程放在只调用一次的设置场景函数中。但是我现在面临另一个问题,因为glutMainLoop,我无法删除内存。
在这种情况下我能做什么?我是 openGL 的新手,所以我真的不知道如何处理这个特殊问题。任何想法将不胜感激。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include "Utility.h"
#include "TgaHeader.h"
#include "TgaImage.h"
#include <GL/glut.h>
using namespace std;
TgaImage* image = NULL;
void setupScene() {
// set color background
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
// load image from file
image = loadTgAFile( "Fire.tga" );
}
void renderScene() {
// clear color
glClear( GL_COLOR_BUFFER_BIT );
// TGA format is 1 byte aligned
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
glRasterPos2i( 0, 0 );
if( image != NULL ) {
glDrawPixels(
image->header.width,
image->header.height,
image->format,
GL_UNSIGNED_BYTE,
image->pixels
);
}
glutSwapBuffers();
}
void resizeWindow( int w, int h ) {
if( h == 0 ) {
h = 1;
}
glViewport( 0, 0, w, h );
// reset coordinate before modifying
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
// set the clipping volume
gluOrtho2D( 0.0f, w, 0.0f, h );
// reset to modelview matrix
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
int main( int argc, char** argv ) {
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "Image" );
// register callback
glutReshapeFunc( resizeWindow );
glutDisplayFunc( renderScene );
// initialize scene
setupScene();
glutMainLoop();
// it will never reach this
delete image;
}
谢谢,
【问题讨论】: