GLUT只运行一次显示回调,不输出到终端

问题描述:

我的GLUT程序行为非常出乎意料。它所做的一切(它应该做的)就是将屏幕清除为蓝色,并画出一个远离距离的紫色三角形。GLUT只运行一次显示回调,不输出到终端

首先,这里是我的代码:

#include <GL/glut.h> 
#include <iostream> 

class Ground{ 
private: 
    float zpos; 
public: 
    Ground(){ 
     zpos = -5.0f; 
    } 
    void Render(){ 
     glColor3f(1.0,0.0,1.0); 
     glBegin(GL_TRIANGLES); 
     glVertex3f(0,0,zpos); 
     glVertex3f(0,1,zpos); 
     glVertex3f(1,1,zpos); 
     glEnd(); 
     zpos -= 0.1f; 
    } 
}; 

class Skybox{ 
public: 
    Skybox(){ 

    } 
    void Render(){ 
     glClearColor(0.5, 0.8, 1.0, 1.0); 
     glClear(GL_COLOR_BUFFER_BIT); 
    } 
}; 

Skybox s; 
Ground g; 
void init(void) 
{ 
    s = Skybox(); 
    g = Ground(); 
    glShadeModel (GL_SMOOTH); 
    glMatrixMode(GL_MODELVIEW); 
    glDepthFunc(GL_LEQUAL); 
    glViewport(0,0,glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT)); 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,glutGet(GLUT_SCREEN_WIDTH)/glutGet(GLUT_SCREEN_HEIGHT),0.1,100); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void display(void) 
{ 
    std::cout << "Hi"; 
    glClearColor(0,0,0,0); 
    glClearDepth(1); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    s.Render(); 
    g.Render(); 
    glLoadIdentity(); 
    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow ("Umm"); 
    init(); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

但是,代码没有按照预期工作 - 紫色三角形不会退回到的距离,它保持静止了,简单cout没有按”即使做任何事情! (但不知何故,所有的显示功能后的代码被执行,但只有一次?)

我在做什么错?

将计时器回调后重新显示现在每一次:

void timer(int value) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(16, timer, 0); 
} 

否则display()将只在操作系统感觉就像是,通常被称为after an expose/damage/paint event (like a window resize, or exposing more of the window by moving another window off of it)

一起:

#include <GL/glut.h> 
#include <iostream> 

class Ground{ 
private: 
    float zpos; 
public: 
    Ground(){ 
     zpos = -5.0f; 
    } 
    void Render(){ 
     glColor3f(1.0,0.0,1.0); 
     glBegin(GL_TRIANGLES); 
     glVertex3f(0,0,zpos); 
     glVertex3f(0,1,zpos); 
     glVertex3f(1,1,zpos); 
     glEnd(); 
     zpos -= 0.1f; 
    } 
}; 

class Skybox{ 
public: 
    Skybox(){ 

    } 
    void Render(){ 
     glClearColor(0.5, 0.8, 1.0, 1.0); 
     glClear(GL_COLOR_BUFFER_BIT); 
    } 
}; 

Skybox s; 
Ground g; 
void init(void) 
{ 
    s = Skybox(); 
    g = Ground(); 
    glShadeModel (GL_SMOOTH); 
    glMatrixMode(GL_MODELVIEW); 
    glDepthFunc(GL_LEQUAL); 
    glViewport(0,0,glutGet(GLUT_SCREEN_WIDTH), glutGet(GLUT_SCREEN_HEIGHT)); 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,glutGet(GLUT_SCREEN_WIDTH)/glutGet(GLUT_SCREEN_HEIGHT),0.1,100); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void display(void) 
{ 
    std::cout << "Hi"; 
    glClearColor(0,0,0,0); 
    glClearDepth(1); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    s.Render(); 
    g.Render(); 
    glLoadIdentity(); 
    glutSwapBuffers(); 
} 

void timer(int value) 
{ 
    glutTimerFunc(16, timer, 0); 
    glutPostRedisplay(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowSize(800, 600); 
    glutCreateWindow ("Umm"); 
    init(); 
    glutTimerFunc(0, timer, 0); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

请问为什么 “喜” 永远不会显示?是因为它不是主线程的一部分吗? – acer

+0

@acer:[我的工作很好](http://i.stack.imgur.com/2HN03.png)。不知道你的设置有什么不同。 – genpfault