2013-01-23 235 views
0

我對glutMainloop()函數非常困惑。在這個函數的循環中使用了哪些函數?我認爲使用了glutIdleFunc(),但是我看到了不使用這個函數的代碼。glutMainloop()和OpenGL中的其他函數的用法

#include <GL/glut.h> 

static void RenderSceneCB() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glutSwapBuffers(); 
} 

static void InitializeGlutCallbacks() 
{ 
    glutDisplayFunc(RenderSceneCB); 
} 


int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); 
    glutInitWindowSize(1024, 768); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Tutorial 01"); 

    InitializeGlutCallbacks(); 

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    glutMainLoop(); 

    return 0; 
} 

此外,在此代碼爲什麼InitializeGlutCallbacks()被使用?爲什麼不只是glutDisplayFunc(RenderSceneCB);寫而不是InitializeGlutCallbacks()? 最後爲什麼InitializeGlutCallbacks()是靜態的?

+3

以'glut'開始的函數不是OpenGL的一部分;它們是glut庫的一部分(可以是FreeGLUT或其他)。 –

回答

2

您真正需要的唯一回調函數是一個glutDisplayFunc函數,當您需要編寫應用程序要顯示的內容時會調用它(通常每秒執行大約60次,但是取決於許多事情,例如計算機性能或垂直同步)。

glutIdleFunc是一個函數,只要沒有別的事情可做就會被調用(這就是爲什麼它是空閒的),但這不是必需的。根據你設計你的應用程序的方式,這個功能是需要的,但是,你可以在上面的程序中看到,主要是可選的。至於爲什麼調用InitializeGlutCallbacks(),這是我們可以稱之爲「良好的編程實踐」:再次,不是必要的,但你會很好地收集函數內的所有初始化函數,所以它在閱讀碼。

最後,我沒有看到絕對的原因,爲什麼要讓這些功能是靜態的,而不是阻止其他模塊訪問它們。你可以嘗試刪除「靜態」,你會發現它的工作原理是一樣的。

編輯:解釋,因爲我猜你是在某種程度上被迫使用過剩,但我同意其他海報,GLFW是一個更好的選擇,如果你可以選擇。

+0

謝謝,但我怎麼知道glutmainloop()使用哪些函數?例如; http://codepad.org/ZcXbabk9 \t glutReshapeFunc(ChangeSize); \t glutDisplayFunc(RenderScene); glutSpecialFunc(SpecialKeys);這三個函數用於glutmainloop()我猜。 – peaceman

+0

如果你指的是它使用的回調函數,這裏有一個完整的列表:http://www.opengl.org/documentation/specs/glut/spec3/node45.html – h4lc0n

+0

而且,正如個人猜測,這裏是一個列表I建議您查看:glutKeyboardFunc,glutMouseFunc,glutMotionFunc,glutPassiveMotionFunc和glutTimerFunc。這可能會讓你在你的軌道上(當然,其他人也很有用) – h4lc0n

相關問題