为什么 LWJGL 不能识别我的 GLFW 版本?

Why doesn't LWJGL recognize my GLFW version?

我用LWJGL写了一个简单的程序。问题是每次我尝试 运行 应用程序时,我都会遇到这个错误:

FATAL ERROR in native method: Thread[main,5,main]: No context is current or a function that is not available in the current context was called. The JVM will abort execution.
    at org.lwjgl.opengl.GL11.glBegin(Native Method)
    at Main.main(Main.java:24)

该错误具有误导性,因为我确实调用了 glfwMakeContextCurrent(window)GL.createCapabilities()

我跟踪到 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3) 的错误。似乎当我删除此行和 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE) 行时,该应用程序将 运行.

我不明白为什么会这样,因为我在 pom.xml.

中确实有 GLFW 3.3 依赖项

这是我的代码:

pom.xml:

<dependencies>
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl</artifactId>
            <version>3.3.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl-glfw</artifactId>
            <version>3.3.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl-opengl</artifactId>
            <version>3.3.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl</artifactId>
            <version>3.3.0</version>
            <classifier>natives-windows</classifier>
        </dependency>
        
        <dependency>
            <groupId>org.lwjgl</groupId>
            <artifactId>lwjgl-glfw</artifactId>
            <version>3.3.0</version>
            <classifier>natives-windows</classifier>
        </dependency>
    </dependencies>

Main.java:

public class Main {
    public static void main(String[] args) {
        glfwInit(); // Initialize GLFW

        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // GLFW version 3
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // GLFW version 3.3
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // GLFW uses CORE profile

        long window = glfwCreateWindow(800, 600, "Hello Triangle", 0, 0);

        glfwMakeContextCurrent(window);
        GL.createCapabilities();

        while(!glfwWindowShouldClose(window)) {
            glfwPollEvents();
            glClearColor(0.05f, 0.1f, 0.2f, 1.0f); // Wipe drawing from previous frame with a black color
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear color buffer and depth buffer

            glBegin(GL_TRIANGLES);
            glVertex2f(-0.5f, -0.5f);
            glVertex2f(0.5f, -0.5f);
            glVertex2f(0f, 0.5f);
            glEnd();

            glfwSwapBuffers(window); // Swap front and back buffer
            glFlush(); // Empties buffers - improves performance
        }

        glfwDestroyWindow(window);
        glfwTerminate();
    }
}

您正在请求 OpenGL 3.3 核心(“3.3”是 不是 LWJGL 或 GLFW 3.3 版 - 它是 OpenGL 上下文您请求的版本),它没有可用的已弃用的 OpenGL 函数,您正在尝试使用 - glBeginglVertex2f.

错误消息提示:

No context is current or a function that is not available in the current context was called.

还有一个误会。澄清一下,代码中的以下注释是 misleading/wrong:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // GLFW version 3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // GLFW version 3.3

window 提示 GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINOR 没有指定要使用哪个版本的 GLFW 本机库,但是 OpenGL 上下文版本 GLFW 将从 OS/driver 请求下一次调用 glfwCreateWindow().

创建的 OpenGL 上下文

使用现代 OpenGL 或请求较低的 OpenGL 版本,例如2.1,通过省略 glfwWindowHint() 调用。在这种情况下,由驱动程序提供给您的 OpenGL 上下文版本决定。在 Windows(使用 NVidia)上,它将是支持的最高可用 OpenGL 兼容版本(例如 4.6)。在 macOS 上它将是 2.1.