OpenGL和GL3W支持问题

OpenGL and GL3W support issues

本文关键字:问题 支持 GL3W OpenGL      更新时间:2023-10-16

GL3W的发出函数发生了一些奇怪的事情。当我调用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"
}

您必须在调用gl3wInit()或常规openGL功能之前制作GL上下文当前电流

在OpenGL Wiki中您可以阅读:

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

注意:GL3W加载核心OpenGL 默认情况下。如果 - ext 标志指定为gl3w_gen.py。

,这是在代码中查看的确认:

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)返回" 4.0"表示,是的,您可以使用该4.0版本。使用glfwWindowHint要求。

我通过切换到高兴而修复了

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);