无法使显示列表生效

时间:2010-10-05 02:46:33

标签: c++ opengl

首先,像往常一样,感谢SO社区的大力支持。

所以我编写了代码来绘制6个gl_quads(形成一个立方体)。最初,此代码立即被绘制(在显示功能中明确地进行了24次顶点调用)。我想将它们放在显示列表中。我阅读了一个关于显示列表的教程,并给了它一个机会。问题是,没有任何东西出现,我有一个绝对指向立方体方向的glulookat(在立即模式下验证)。因此,基本上代码在不使用显示列表时可以正常工作,但在我尝试使用列表时却没有。

好的,够了,让我们来看看代码:

第二次编辑 - 移动了glGenLists调用initGl,它运行正常。谢谢大家

* 编辑 - * glGenList调用是全局调用的:

GLuint skybox = glGenLists(1);

我仍然得到相同的结果。什么都没有渲染到屏幕上。

设置列表(在initgl函数中):

glViewport(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); 
glEnable(GL_DEPTH_TEST);    // Enables Depth Testing
glDepthFunc(GL_LEQUAL);

glMatrixMode(GL_PROJECTION);    //setup the projection matrix
glLoadIdentity();
gluPerspective(45, WINDOW_WIDTH/WINDOW_HEIGHT,.1,200.0);

glMatrixMode(GL_MODELVIEW); //switch to modelview
glLoadIdentity();
gluLookAt(-2,2,2,0,0,0,0,1,0);
glClearColor(0, 0, 0, 0);

glNewList(skybox, GL_COMPILE_AND_EXECUTE); //draw the list once to compile/store
drawEnv(); //draw 6 quads
glEndList(); //end list

显示功能(省略不相关的代码):

/* Clear buffers */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//-----Draw Skybox------
glEnable(GL_TEXTURE_2D);
glPushMatrix();  //save env settings (I've tried removing this push/pop pair with same results
glCallList(skybox);
glPopMatrix();
glDisable(GL_TEXTURE_2D);

drawEnv()函数:

//---------------------------
//--------RIGHT WALL---------
//---------------------------
//This code draws correctly if I move this to the display function (immediate drawing)  
glBindTexture(GL_TEXTURE_2D,rightTextureId);
glBegin(GL_QUADS);  
glTexCoord2f(0.0, 0.0);     glVertex3f( 1.0f, 1.0f, 1.0f);   //V2
glTexCoord2f(0.0, 1.0);     glVertex3f( 1.0f,-1.0f, 1.0f);   //V1
glTexCoord2f(1.0, 1.0);     glVertex3f( 1.0f,-1.0f,-1.0f);   //V3
glTexCoord2f(1.0, 0.0);     glVertex3f( 1.0f, 1.0f,-1.0f);   //V4
glEnd();

//repeat 5 more times

1 个答案:

答案 0 :(得分:2)

你几乎就在那里,你只需要先致电glGenLists()生成一组连续的空显示列表

GLuint listID;
listID = glGenLists( 1 ); // generate 1 display list
glNewList( listID, GL_COMPILE );
// whatever you want in the display list
glEndList();

// call the display list
glCallList( listID );

您还应该进行一些错误检查,以确保glGenLists()返回有效的显示列表。