2016-07-27 4 views
2

GLUTプログラムが予期せず動作しています。すべて(それがすべきことすべて)は、画面が青く、遠くに後退する紫色の三角形を描きます。GLUTはディスプレイコールバックを1回だけ実行し、端末に出力しません。

まず第一に、ここに私のコードは次のとおりです。ただし、期待どおりのコードは動作しません

#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」のdoesnの何もしない! (しかし何とかして、表示機能の後のコードはすべて実行されますが、一度だけです)

私は間違っていますか?

答えて

1

は、すべての今、もう一度再表示を投稿するタイマーコールバックを追加します。

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

OSがそれのように感じているとき、それ以外の場合は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

関連する問題