2015-01-04 30 views
0

據我所知,當我設置上GLFW這些方面的制約:爲什麼我沒有使用GLFW獲得向前兼容的OpenGL上下文?

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

我應該得到的跑步機上的最大可用OpenGL上下文,只要是上面的OpenGL 3.3。但是,通過使用glGetString獲取OpenGL上下文版本,我發現情況並非如此。每次我查詢上下文版本glGetString時,我只會得到我用glfwWindowHint設置的主版本和次版本,上面沒有任何內容。請記住,我的GPU支持OpenGL 4.5。

另一件需要注意的事情是,當我沒有設置任何約束條件時,我確實獲得了OpenGL 4.5上下文。

下面是完整的源代碼,這似乎重現問題:

#define GLEW_STATIC 

#include <iostream> 

#include <GL\glew.h> 
#include <GLFW\glfw3.h> 
#include <glm\glm.hpp> 

int main(int argc, char argv[]) 
{ 

    if (!glfwInit()) 
    { 
     std::cerr << "Failed to initialize GLFW 3.0.4" << std::endl; 
     getchar(); 

     glfwTerminate(); 
     return -1; 
    } 

    std::cout << "Initialized GLFW 3.0.4" << std::endl; 

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    GLFWwindow* m_window = glfwCreateWindow(640, 480, "Koala", NULL, NULL); 

    if (!m_window) 
    { 
     std::cerr << "Failed to create OpenGL 3.3+ context" << std::endl; 
     getchar(); 
     glfwTerminate(); 
     return -1; 
    } 

    glfwMakeContextCurrent(m_window); 

    std::cout << "Created OpenGL 3.3+ context" << std::endl; 

    glewExperimental = GL_TRUE; 

    if (glewInit() != GLEW_OK) 
    { 
     std::cerr << "Failed to initialize GLEW 1.11.0" << std::endl; 
     getchar(); 
     glfwTerminate(); 
     return -1; 
    } 

    std::cout << "Initialized GLEW 1.11.0" << std::endl; 

    const GLubyte* renderer = glGetString(GL_RENDERER); 
    const GLubyte* version = glGetString(GL_VERSION); 

    std::cout << "GPU: " << renderer << std::endl; 
    std::cout << "OpenGL Version: " << version << std::endl; 

    while (!glfwWindowShouldClose(m_window)) 
    { 
     glfwSwapBuffers(m_window); 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 

} 
+0

您是否嘗試過其他任何配置文件[窗口提示](http://www.glfw.org/docs/latest/window.html#window_hints),比如'GLFW_OPENGL_ANY_PROFILE'或'GLFW_OPENGL_COMPAT_PROFILE'? –

+0

@JoachimPileborg將其設置爲GLFW_OPENGL_COMPAT_PROFILE似乎已修復它,但爲什麼?它應該以任何方式工作,而且,我想要一個核心配置文件。有什麼辦法獲得最大的核心配置文件? – Nooble

+0

爲什麼你想要最高的支持版本?如果他們以後刪除你的代碼使用的功能呢? – immibis

回答

7

我應該得到的跑步機上的最大可用OpenGL上下文,只要是上面的OpenGL 3.3。

這不是它定義的方式。從GLFW documentation

的GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定創建上下文必須是兼容的客戶端API版本。

支持OpenGL,這些提示都沒有硬約束,因爲他們不必完全匹配,但如果所得到的OpenGL版本低於要求的一個glfwCreateWindow仍然會失敗。

儘管無法向驅動程序詢問支持的最高版本的環境,但大多數驅動程序在向GLFW請求1.0版環境時會提供此信息。

所以「大多數司機」會給你你所期望的,但這並不能保證。

典型的用法是指定支持代碼使用的所有功能的最低版本。那麼你不在乎你是否得到完全的版本,或者可能是更高的版本。但是你知道如果最低版本不被支持,你將會失敗。

如果要動態測試支持哪個版本,最好的方法是首先指定可以利用的最高版本,然後測試返回值glfwCreateWindow()。如果失敗,只要失敗就縮小版本,然後再次調用glfwCreateWindow(),直到達到可以運行的最低版本。然後,您可以跟蹤哪個版本成功,或者由glGetString(GL_VERSION)報告的版本,並使用它在運行時決定您可以使用哪些功能。

相關問題