2016-08-26 5 views
0

私はglutDisplayFunc(render)で関数を呼び出すと、画面に単純な移​​動三角形を表示できません。私の関数を通常の呼び出しrender()のように呼び出すと、三角形はうまく表示されますが、この場合は三角形がアニメーション化されません。glutDisplayFunc()は描画しませんが、通常の関数呼び出しは

だから、基本的に私は2つの問題があります。

  1. をglutDisplayFuncとの通話機能三角形を描くことはできません(レンダリング)
  2. のような関数呼び出しが(レンダリング時に三角形をアニメーション化することはできません)が、それは三角形を描くことができますしかし、。

    int main(int argc, char** argv) 
    { 
    
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowSize(600,600); 
    glutInitContextVersion(4,3); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 
    glutCreateWindow("Shader"); 
    
    if (glewInit()) { 
    cerr << "Unable to initialize GLEW ... exiting" << endl; 
    exit(EXIT_FAILURE); 
    } 
    
    startup(); 
    // render();  // WORKS FINE AND DRAW TRIANGLE 
    glutDisplayFunc(render); //DOESN'T DRAW TRIANGLE 
    shutdown(); 
    
    glutMainLoop(); 
    return 0; 
    
    } 
    

    私はシェーダーがうまくコンパイルされていると信じて、そのためのコードの一部に誤りがない:

    void render() 
    { 
    
    currentTime = glutGet(GLUT_ELAPSED_TIME); 
    glClear(GL_COLOR_BUFFER_BIT); 
    
    GLfloat color[] = { (float)sin(currentTime) * 0.5f + 0.5f, (float)cos(currentTime) * 0.5f + 0.5f, 0.0f, 1.0f }; 
    
    glClearBufferfv(GL_COLOR, 0, color); 
    
    GLfloat attrib[] = { (float)sin(currentTime) * 0.5f, (float)cos(currentTime) * 0.6f, 0.0f, 0.0f }; 
    
    glVertexAttrib4fv(0, attrib); 
    // Use the program object we created earlier for rendering 
    
    glUseProgram(rendering_program); 
    
    //Draw triangle 
    glDrawArrays(GL_TRIANGLES,0,3); 
    
    glutSwapBuffers(); 
    
    } 
    

    メイン:

は、以下の私のメインとディスプレイのコードですglutDisplayFunc()を使わないで三角形を描画しています。唯一の問題はglutDisplayFunc(render)を使うときです。何も描かれていない。

どこが間違っていますか?上記の2つの問題を解決するにはどうすればよいですか?

+1

あなたは 'glutMainLoop()'を入力する前に 'shutdown()'を呼んでいることに気づいていますね。あなたが私たちに示したコードでコールバックを呼び出さないようにする理由は絶対にありません。私が 'render()'にブレークポイントを設定すると、デバッガは少なくとも1回は実行されません。 'shutdown()'でコールバックを再度登録解除します... – thokra

+0

omg私はそれを認識しませんでした。 !それは今働く。説明してくれてありがとう。 –

答えて

2

glutDisplayFuncは、それ自身をレンダリングしません。レンダリングが行われる必要があるときにglutによって使用されるべき関数を登録します。 ifsefの呼び出しはglutMainLoop()のどこかで発生します。レンダリングプロセスを開始する前にすべてをシャットダウンするので、システムがレンダリングを試みるときにデータは使用できません。

+0

あなたはそれを本当にうまく説明しました。なぜ私は今問題が起きているのかを完全に理解していました。迅速な対応をしていただきありがとうございます。 –

関連する問題