opengl程序问题,为啥只有白屏?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl程序问题,为啥只有白屏?相关的知识,希望对你有一定的参考价值。

程序如下:
#include <windows.h>
#include <GL/glut.h>

#include <stdlib.h>

void display(void)
glColor3f(1.0,1.0,1.0);
glutWireSphere(0.8,18,18);


int main()
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow("sphere");

glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);

glRotatef(60.0,1.0,0.0,0.0);

glutDisplayFunc(display);

glutMainLoop();
glFlush();
return 0;


用的是codeblock+glut,很简单的程序,为什么输出来是一块白色的屏幕,没有球。而且底色也应该是黑的啊?
求个解决方法呗!

参考技术A 程序在glutMainLoop()无限循环,glFlush()永远执行不了
丢到display中。

OpenGL 白屏

【中文标题】OpenGL 白屏【英文标题】:OpenGL White Screen 【发布时间】:2014-03-07 20:54:27 【问题描述】:

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

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: 这是我调用的完整代码,用于在从我的主 glut .cpp 调用的类 Track.cpp 中显示我的曲目

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


【问题讨论】:

【参考方案1】:

来自 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 块之外。

【讨论】:

感谢您的快速回复,该模块的学费因员工生病而被削弱,每个人都认为这很好,但我个人对缺乏教育支持感到恼火。再次感谢!

以上是关于opengl程序问题,为啥只有白屏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的自由幻想在OPENGL模式和软件模式进去都是白屏?

OpenGL 白屏

请问为啥玩QQ三国是选择OpenGL模式或D3D模式游戏画面会出现白屏呢?

我的OpenGL学习进阶之旅当你运行OpenGL程序的时候,程序并不绘制任何内容,并且白屏和黑屏的时候怎么排查?

我的OpenGL学习进阶之旅当你运行OpenGL程序的时候,程序并不绘制任何内容,并且白屏和黑屏的时候怎么排查?

opengl 运行白屏