2014-09-01 42 views
0

在我調用OpenGL函數後,我每次都在代碼中添加glGetError()來自glGetError()的INVALID_ENUM錯誤。 gl,glu,glew,glfw?

其實我不會撥打glGetError(),而是寫一個函數(DisplayGlErrors())來打印控制檯中的所有錯誤(通過一個循環)。所以,現在我想,每次我打電話給我的功能後(例如)gluLookAt()我應該能夠得到所有由openGL槽功能引起的錯誤。

現在讓我們來談談我的問題。從這段代碼:

GL_engine::GL_engine(Application* appli):engine(appli), width(get_parent()->getWidth()), height(get_parent()->getHeight()) 
{ 
    if (GLEW_OK != glewInit()) // glew needs to be initialised, otherwise we get an error, AFTER a windows has been created BUT BEFORE using buffers 
    { 
    std::cout << "glewInit() failed" << std::endl; 
    exit(EXIT_FAILURE); 
    } 
    DisplayGlErrors(__FILE__, __LINE__); 
    glGetIntegerv(GL_MAJOR_VERSION, &contextMajor);      DisplayGlErrors(__FILE__, __LINE__); 
    glGetIntegerv(GL_MINOR_VERSION, &contextMinor);      DisplayGlErrors(__FILE__, __LINE__); 
    std::cout << "Created OpenGL " << contextMajor <<"."<< contextMinor << " context" << std::endl; 
    glClearColor(0.25f, 0.25f, 0.25f, 1.0f);        DisplayGlErrors(__FILE__, __LINE__); 
    cam = Camera();              DisplayGlErrors(__FILE__, __LINE__); 
    worldAxis.initialise(); DisplayGlErrors(__FILE__, __LINE__);   DisplayGlErrors(__FILE__, __LINE__); 
    worldGrid.initialise(); DisplayGlErrors(__FILE__, __LINE__);   DisplayGlErrors(__FILE__, __LINE__); 
} 

我(在控制檯):

OpenGL error #1: INVALID_ENUM(/WelcomeToYourPersonalComputerInferno/666/src/GL_engine.cc, 40) 
OpenGL error #1: INVALID_ENUM(/WelcomeToYourPersonalComputerInferno/666/src/GL_engine.cc, 41) 
Created OpenGL 0.0 context 

注: :contextMajorcontextMinorGLint變量。

我沒有任何想法意味着這些INVALID_ENUM ...我甚至覺得它的OpenGL也不知道......

if for any reason you want to look inside my code, I just updated my git

要完成,因爲我使用GLFW,GLU ,GLEW在我的程序中。我想知道在我從這些庫中調用函數之後調用glGetError()(仍然低谷DisplayGlErrors())是否有意義。

回答

1

這裏有一些雞和雞蛋的問題。參數GL_MAJOR_VERSIONGL_MINOR_VERSION對於glGetIntegerv()僅在OpenGL 3.x中引入(某些規範信息建議3.0,某些3.1)。它看起來像你的上下文沒有至少這個版本,所以你不能使用這個API來檢查版本。

如果您至少需要3.x才能運行代碼,則應該在創建上下文時指定該代碼。看起來在GLFW中使用glfwWindowHint()呼叫用於此目的。

要獲得所有OpenGL版本的支持版本,可以使用glGetString(GL_VERSION)。這個調用從OpenGL 1.0開始就可用,所以它可以在任何可能的情況下工作。

什麼時候打電話glGetError():在開發過程中稱它太多並不會令人傷心。如果您關心軟件的性能,那麼您只需要確保禁用/移除發佈版本的調用。對於具體的庫你提到:

  • GLEW:我不認爲你平時GLEW glewInit()後調用任何東西。除了可能glewIsSupported()。無論如何,GLEW只是提供對OpenGL入口點的訪問,我不相信它會讓GL調用它自己。所以我不認爲在GLEW調用有用之後調用glGetError()

  • GLU:這些調用肯定會使OpenGL調用,因此調用glGetError()後纔有意義。請注意,GLU已被棄用,並且不再可用於OpenGL Core Profile。

  • GLFW:這提供了窗口系統接口的抽象,所以我不希望它做出OpenGL調用。在這種情況下,調用glGetError()似乎沒有必要。它有自己的錯誤處理(http://www.glfw.org/docs/latest/group__error.html)。

這部分是偏好問題。我個人認爲每次打電話後都不需要致電glGetError()。由於錯誤是粘性的,所以即使它是來自早期調用,也可以始終檢測到錯誤發生的時間,並在必要時進行搜索。我大多隻是把這樣的檢查在正選賽函數的末尾:

assert(glGetError() == GL_NO_ERROR); 

那麼如果這個觸發,我開始傳播更多的跨越這些代碼檢查,直到我把範圍縮小到一個特定的電話。一旦我找到並解決了錯誤,我再次刪除這些額外的電話。

在每次通話後始終進行檢查顯然會更快地告訴您發生錯誤的位置。但是,當閱讀和維護代碼時,我會發現讓地方的支票分散注意力。你真的必須弄清楚什麼對你最有效。

+0

thx爲您的答案,這是完美的!我知道GLU已被棄用,我認爲要刪除它,但要做很多事情......其實我在很多地方添加了'glGetError()'調用來檢查一切是否正常,並且直接獲取行是錯的。我將在未來刪除它們。再次謝謝你 – 2014-09-02 01:19:59