OpenGl程序用完所有ram,然后关闭

OpenGl程序用完所有ram,然后关闭,opengl,Opengl,我用OpenGL编写了一个程序,当我运行它时,程序会填满所有ram,然后以大约3300/4000 Mb的ram关闭。这是我的节目: #include <iostream> #include <stdlib.h> #include <fstream> #include <windows.h> #include <gl/gl.h> #include <gl/glut.h> #include <gl/GLU.h> #i

我用OpenGL编写了一个程序,当我运行它时,程序会填满所有ram,然后以大约3300/4000 Mb的ram关闭。这是我的节目:

#include <iostream>
#include <stdlib.h>
#include <fstream>
#include <windows.h>
#include <gl/gl.h>
#include <gl/glut.h>
#include <gl/GLU.h>
#include <gl/glaux.h>


using namespace std;


GLuint texture;

AUX_RGBImageRec* LoadImage (char* file) {

return auxDIBImageLoad (file);
}

int LoadTexture (char* file) {
AUX_RGBImageRec* Textureimage;

Textureimage = LoadImage (file);
glGenTextures (1, &texture);
glBindTexture (GL_TEXTURE_2D, texture);
glTexImage2D (GL_TEXTURE_2D,
0,
GL_RGB,
Textureimage->sizeX,
Textureimage->sizeY,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
Textureimage->data
);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
delete Textureimage;
return 0;
}


void exitkey (unsigned char key, int x, int y) {
switch (key) {
case 27:
exit (0);
}
}


void Render3d () {
glEnable (GL_DEPTH_TEST);

glEnable (GL_NORMALIZE);

glEnable (GL_LIGHTING);

glEnable (GL_LIGHT0);

glEnable (GL_LIGHT1);

glEnable (GL_TEXTURE_2D);

}


void incaseofresize (int w, int h) {
glViewport (0, 0, w, h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (90.0, (double)w / (double)h, 0.7, 300.0);
}


double theangle = 30.0;

void draw () {
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
glTranslatef (0.0, 0.0, -6.0);
glPushMatrix ();

glRotatef (theangle, 0.0, 1.0, 0.0); 

GLfloat ambientlightcolor [] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light0color [] = { 0.5, 0.5, 0.0, 1.0 };
GLfloat light1color [] = { 1.0, 0.0, 0.0, 1.0 };
GLfloat light0position [] = { 2.0, 0.0, 3.0, 1.0 };
GLfloat light1position [] = { -2.0, 0.0, 3.0, 1.0 };

glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambientlightcolor);
glLightfv (GL_LIGHT0, GL_DIFFUSE, light0color);
glLightfv (GL_LIGHT0, GL_POSITION, light0position);
glLightfv (GL_LIGHT1, GL_DIFFUSE, light1color);
glLightfv (GL_LIGHT1, GL_POSITION, light1position);


LoadTexture ("me.bmp");


glBegin (GL_QUADS);
//Drawing shape
glColor3f (1.0, 1.0, 1.0);
//Left side
glNormal3f (0.0, 0.0, 1.0);
glTexCoord2f (0.0, 0.0);
glVertex3f (-1.5, -1.0, -1.5);
glTexCoord2f (1.0, 0.0);
glVertex3f (0.0, -1.0, 1.5);
glTexCoord2f (1.0, 1.0);
glVertex3f (0.0, 1.0, 1.5);
glTexCoord2f (0.0, 1.0);
glVertex3f (-1.5, 1.0, -1.5);

glEnd ();


LoadTexture ("mom.bmp");


glBegin(GL_QUADS);

//Right side
glNormal3f (0.0, 1.0, 1.0);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, -1.0, 1.5);
glTexCoord2f (1.0, 0.0);
glVertex3f (1.5, -1.0, -1.5);
glTexCoord2f (1.0, 1.0);
glVertex3f (1.5, 1.0, -1.5);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, 1.0, 1.5);

glEnd ();

glBegin (GL_QUADS);

//Back right side
glNormal3f (0.0, 1.0, 0.0);
glVertex3f (1.5, -1.0, -1.5);
glVertex3f (0.0, -1.0, -4.5);
glVertex3f (0.0, 1.0, -4.5);
glVertex3f (1.5, 1.0, -1.5);
glEnd ();

glBegin (GL_QUADS);

glNormal3f (0.0, 1.0, 0.0);
glVertex3f (0.0, -1.0, -4.5);
glVertex3f (-1.5, -1.0, -1.5);
glVertex3f (-1.5, 1.0, -1.5);
glVertex3f (0.0, 1.0, -4.5);

glEnd ();

glutSwapBuffers ();
}

void rotate (int value) {
theangle += 1.5;
if (theangle > 360) {
theangle -=360;
}
glutPostRedisplay ();
glutTimerFunc (50, rotate, 0);
}

int main (int argcpp, char** argv) {
glutInit (&argcpp, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (720, 480);

glutCreateWindow ("OpenGL");
Render3d ();

glutDisplayFunc (draw);
glutKeyboardFunc (exitkey);
glutReshapeFunc (incaseofresize);
glutTimerFunc (50, rotate, 0);

glutMainLoop ();

return 0;
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
胶合结构;
AUX_RGBImageRec*加载图像(字符*文件){
返回auxDIBImageLoad(文件);
}
int LoadTexture(字符*文件){
AUX_RGBImageRec*纹理图像;
Textureimage=LoadImage(文件);
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
glTexImage2D(GL_纹理_2D,
0,
德国劳埃德大学,
Textureimage->sizeX,
纹理图像->尺寸,
0,
德国劳埃德大学,
GL_无符号字节,
纹理图像->数据
);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
删除纹理图像;
返回0;
}
void exitkey(无符号字符键,整数x,整数y){
开关(钥匙){
案例27:
出口(0);
}
}
void Render3d(){
glEnable(GLU深度试验);
glEnable(GL_正常化);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glEnable(Glu LIGHT1);
glEnable(GL_纹理_2D);
}
尺寸(整数w、整数h)中的空隙{
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
(90.0,(双)w/(双)h,0.7300.0);
}
双角度=30.0;
无效提款(){
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glTranslatef(0.0,0.0,-6.0);
glPushMatrix();
glRotatef(角度,0.0,1.0,0.0);
GLfloat ambientlightcolor[]={0.0,0.0,0.0,1.0};
GLfloat light0color[]={0.5,0.5,0.0,1.0};
GLfloat light1color[]={1.0,0.0,0.0,1.0};
GLfloat light0position[]={2.0,0.0,3.0,1.0};
GLfloat light1position[]={-2.0,0.0,3.0,1.0};
glLightModelfv(GL_灯光_模型_环境光,ambientlightcolor);
glLightfv(GL_LIGHT0、GL_漫反射、light0color);
glLightfv(GL_LIGHT0,GL_位置,LIGHT0位置);
glLightfv(GL_LIGHT1、GL_DIFFUSE、LIGHT1彩色);
glLightfv(GLU LIGHT1、GLU位置、LIGHT1位置);
LoadTexture(“me.bmp”);
glBegin(GL_QUADS);
//图形形状
GL3F(1.0,1.0,1.0);
//左侧
glNormal3f(0.0,0.0,1.0);
glTexCoord2f(0.0,0.0);
glVertex3f(-1.5,-1.0,-1.5);
glTexCoord2f(1.0,0.0);
glVertex3f(0.0,-1.0,1.5);
glTexCoord2f(1.0,1.0);
glVertex3f(0.0,1.0,1.5);
glTexCoord2f(0.0,1.0);
glVertex3f(-1.5,1.0,-1.5);
格伦德();
LoadTexture(“mom.bmp”);
glBegin(GL_QUADS);
//右侧
glNormal3f(0.0,1.0,1.0);
glTexCoord2f(0.0,0.0);
glVertex3f(0.0,-1.0,1.5);
glTexCoord2f(1.0,0.0);
glVertex3f(1.5,-1.0,-1.5);
glTexCoord2f(1.0,1.0);
glVertex3f(1.5,1.0,-1.5);
glTexCoord2f(0.0,1.0);
glVertex3f(0.0,1.0,1.5);
格伦德();
glBegin(GL_QUADS);
//右后侧
glNormal3f(0.0,1.0,0.0);
glVertex3f(1.5,-1.0,-1.5);
glVertex3f(0.0,-1.0,-4.5);
glVertex3f(0.0,1.0,-4.5);
glVertex3f(1.5,1.0,-1.5);
格伦德();
glBegin(GL_QUADS);
glNormal3f(0.0,1.0,0.0);
glVertex3f(0.0,-1.0,-4.5);
glVertex3f(-1.5,-1.0,-1.5);
glVertex3f(-1.5,1.0,-1.5);
glVertex3f(0.0,1.0,-4.5);
格伦德();
glutSwapBuffers();
}
空心旋转(int值){
角度+=1.5;
如果(角度>360){
角度-=360;
}
再发现();
glutTimerFunc(50,旋转,0);
}
int main(int argcpp,字符**argv){
glutInit(&argcpp,argv);
glutInitDisplayMode(GLUT_双精度| GLUT_RGB | GLUT_深度);
glutInitWindowSize(720480);
glutCreateWindow(“OpenGL”);
Render3d();
glutDisplayFunc(draw);
glutKeyboardFunc(exitkey);
GLUTEFUNC(增加尺寸);
glutTimerFunc(50,旋转,0);
glutMainLoop();
返回0;
}


我认为是LoadTexture函数在每个循环中一次又一次地重新加载图像,我找不到在每个循环后删除图像数据的方法。

每次程序迭代显示函数时,它都会将图像加载到新的纹理对象中,而不会释放以前创建的图像


标准方法是只加载一次纹理。OpenGL在所谓的纹理对象中组织纹理,由所谓的名称ID标识。LoadTexture确实返回此ID。您可以通过调用
glBindTexture(GL\u texture\u 2D,TextureID)来使用此类纹理

在绘制的每个帧中从辅助存储加载纹理?请仔细看看你在做什么。您不认为在程序启动或类似的情况下加载资源是个好主意吗?