OpenGL和GL3W支持问题

时间:2018-02-13 04:03:22

标签: c++ opengl

gl3w的isSupported功能发生了一些奇怪的事情。当我调用isSupported(4, 0)时,它返回false,这意味着不支持OpenGL 4.0。但是,当我打电话给glGetString(GL_VERSION)时,它说的是OpenGL 4.0版。 这是否意味着我可以使用OpenGL 4.0函数?

我在C ++和Visual Studio 2017中使用gl3w

#include <GL/gl3w.h>
#include <GLFW/glfw3.h>

int main(int argc, char** argv){



    if(!glfwInit()) {
        FATAL_ERROR("Failed to initialise GLFW");
    }

    glfwSetErrorCallback(glfwErrorCallback);

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL", nullptr, nullptr);

    //If i put glfwMakeContextCurrent here gl3wInit fails
    //glfwMakeContextCurrent(window);

    if (!window) {
        glfwTerminate();
        FATAL_ERROR("Window creation failed");
    }

    if(!gl3wInit()) {} // handle that

    glfwMakeContextCurrent(window);

    bool support = gl3wIsSupported(4, 0);  // returns false

    const char* version = glGetString(GL_VERSION); // return "4.0.0"
}

3 个答案:

答案 0 :(得分:2)

在致电gl3wInit()或常规OpenGL函数之前,您必须make a GL context current,否则他们将无法执行任何有用的操作。

答案 1 :(得分:2)

OpenGL wiki中,您可以阅读:

  

GL3W库专注于OpenGL 3和4的核心配置文件   仅加载这些OpenGL版本的核心入口点。它支持   Windows,Mac OS X,Linux和FreeBSD。

     

注意:GL3W加载核心OpenGL   只是默认情况下。如果是--ext,将加载所有OpenGL扩展   flag被指定为gl3w_gen.py。

code

内部确认了这一点
int gl3wIsSupported(int major, int minor)
{
    if (major < 3) // <<<<=========== SEE THIS
        return 0;
    if (version.major == major)
        return version.minor >= minor;
    return version.major >= major;
}

您要求glfwWindowHint提供旧的2.0版本。因此,gl3wIsSupported将返回falsegl3wInit将返回GL3W_ERROR_OPENGL_VERSION

glGetString(GL_VERSION)返回&#34; 4.0&#34;意味着,是的,您可以使用该4.0版本。通过glfwWindowHint来询问。

答案 2 :(得分:0)

我通过切换到高兴来修复它

if (!glfwInit()) {
    FATAL_ERROR("Failed to initialise GLFW");
}

glfwSetErrorCallback(glfwErrorCallback);

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

GLFWwindow* window = glfwCreateWindow(640, 480, "OpenGL", nullptr, nullptr);


if (!window) {
    glfwTerminate();
    FATAL_ERROR("Window creation failed");
}

glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    glfwDestroyWindow(window);
    glfwTerminate();
    FATAL_ERROR("Failed to initialise OpenGL context");
}


PRINT("OpenGL Version: " << GLVersion.major << "." << GLVersion.minor);