首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL白屏

OpenGL白屏
EN

Stack Overflow用户
提问于 2014-03-07 20:54:27
回答 1查看 727关注 0票数 0

在我使用freeglut的openGL程序中,屏幕完全被这段代码磨白了:

代码语言:javascript
复制
glBegin(GL_QUADS);   
    glPushMatrix();
        glVertex3f(trackRadius*cos((double)x), trackHeight*sin(trackNumberOfHills*x), trackRadius*sin(x));
        glVertex3f((trackRadius+1)*cos((double)x), trackHeight*sin(trackNumberOfHills*x), (trackRadius+1)*sin(x));
        glVertex3f(trackRadius*cos((double)x+(0.005)), trackHeight*sin(trackNumberOfHills*(x+0.005)), trackRadius*sin(x+0.005));
        glVertex3f((trackRadius+1)*cos((double)x+0.005), trackHeight*sin(trackNumberOfHills*(x+0.005)), (trackRadius+1)*sin(x+0.005));
    glPopMatrix();
glEnd();

以上代码用于显示两条铁轨之间的线路,这些线路在删除上述代码时生成并显示得很好。卡丁车也显示得很好。

我已经发现,如果删除glPushMatrix();和glPopMatrix(),一切都会显示得很好,但是我需要矩阵推送/弹出行,不是吗?

编辑1:这是我调用的完整代码,用于在Track.cpp类中显示我的轨道,这个类是从我的主要过剩.cpp调用的。

代码语言:javascript
复制
void Track::RenderTrack() 
{
double x=-3.14;
glNewList(1, GL_COMPILE);  // create sphere display list for Object 1
glutSolidSphere(0.1,20,20); 
glEndList();

glNewList(2, GL_COMPILE);
for (x; x<3.14;x= x+.005)
{
//first track
glPushMatrix();
glColor3f(1.0,0.0,0.0);
glTranslatef(trackRadius*cos((double)x),trackHeight * sin((double)trackNumberOfHills*x),trackRadius*sin((double)x));
glCallList(1);
glPopMatrix();

//Second track
glPushMatrix();
glColor3f(0.0,1.0,0.0);
glTranslatef((trackRadius+1)*cos(x),trackHeight * sin(trackNumberOfHills*x),(trackRadius+1)*sin(x));
glCallList(1);
glPopMatrix();


//Track Insides
glBegin(GL_QUADS);   
glPushMatrix();
glVertex3f(trackRadius*cos((double)x), trackHeight*sin(trackNumberOfHills*x), trackRadius*sin(x));
glVertex3f((trackRadius+1)*cos((double)x), trackHeight*sin(trackNumberOfHills*x), (trackRadius+1)*sin(x));
glVertex3f(trackRadius*cos((double)x+(0.005)), trackHeight*sin(trackNumberOfHills*(x+0.005)), trackRadius*sin(x+0.005));
glVertex3f((trackRadius+1)*cos((double)x+0.005), trackHeight*sin(trackNumberOfHills*(x+0.005)), (trackRadius+1)*sin(x+0.005));
glPopMatrix();
glEnd();
}
glEndList();

glCallList(2); // call the list to draw it

}
EN

回答 1

Stack Overflow用户

发布于 2014-03-07 20:57:22

来自opengl文档:

在glBegin和glEnd之间只能使用GL命令的子集。命令有glVertex、glColor、glSecondaryColor、glIndex、glNormal、glFogCoord、glTexCoord、glMultiTexCoord、glVertexAttrib、glEvalCoord、glEvalPoint、glArrayElement、glMaterial和glEdgeFlag。此外,使用glCallList或glCallLists来执行仅包含前面命令的显示列表也是可以接受的。如果在glBegin和glEnd之间执行任何其他GL命令,则设置错误标志并忽略该命令。

glPushMatrixglPopMatrix不在此列表中,因此您的代码将被忽略。

您可以将它们放在glBegin / glEnd块之外。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22260469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档