当前位置: 首页 > 知识库问答 >
问题:

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

相洛华
2023-03-14

我用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)

该错误具有误导性,因为我确实调用了< code > glfwMakeContextCurrent(window)和< code > GL . create capabilities()。

我将错误跟踪到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();
    }
}

共有1个答案

丁光华
2023-03-14

您请求的是OpenGL 3.3核心(“3.3”不是LWJGL或GLFW版本3.3-它是您请求的OpenGL上下文版本),它没有您尝试使用的不推荐使用的OpenGL函数-<code>glBegin</code>和<code>glVertex2f</code>。

错误消息提示:

没有上下文是当前的,或者调用了当前上下文中不可用的函数。

还有一个误解。为了澄清,代码中的以下注释具有误导性/错误:

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

窗口提示GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINOR没有指定使用哪个版本的GLFW本机库,但是GLFW将从操作系统/驱动程序请求哪个OpenGL上下文版本来获取下一次调用glfwCreateWindow()创建的OpenGL上下文。

要么使用现代OpenGL,要么通过省略glfwWindowHint()调用来请求较低的OpenGL版本,例如2.1。在这种情况下,这取决于它为您提供的OpenGL上下文版本的驱动程序。在Windows上(与NVidia一起),它将是支持的最高可用OpenGL兼容性版本(例如4.6)。在macOS上,它将是2.1。

 类似资料:
  • 对于这个程序,它要求用户输入他们的全名。然后,它通过在名字和姓氏之间的空格处将它们分开来排序名字和姓氏。但是,indexOf()无法识别空格并且只返回-1。为什么?谢谢。 以下是PracticeIt的提示: 编写一个名为process Name的方法,该方法接受控制台的Scanner作为参数,并提示用户输入他或她的全名,然后以相反的顺序打印名称(即姓氏、名字)。您可以假设只会给出名字和姓氏。您应该

  • 我想验证只有当另外两个输入为空时才需要输入。所以我使用required_without_all验证规则。 根据Laravel 5.4文件要求,无需所有: 只有当所有其他指定字段都不存在时,验证中的字段才必须存在且不为空。 然而,我认为我不知道现在是什么意思,因为我认为这意味着输入必须被填充。 当我在用户名为空的情况下运行测试时,无论firstname和lastname输入是否为空,它都会返回以下错

  • 有25种类型的空白。在下面的代码中显示,25种类型中有4种在Java中不被视为空白。为什么? 参考-https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/character.html#IsWhitespace(char)

  • 我不明白为什么我的Nexus4没有出现在adb设备列表中。我试过以下方法 $adb杀死服务器;亚洲开发银行设备 亚行在我的路上。当我查看系统信息时,会显示Nexus 4。 我试着询问xda开发人员,但没有成功。有什么建议我可以试试吗? 提前感谢

  • 在PhpStorm的最新版本(2018年)中,所以它在项目的2017年版本中,我有一个名为<code>User_model的文件。php</code>,并且PhpStorm不将其识别为php文件,而是将其识别成纯文本文件。 但它并不总是如此;我最近才注意到。 我意识到问题出在文件名中()。因为只要我更改文件名(例如,),该文件就会立即被识别为php文件。 是不是(< code>User_model

  • 在我的spring-maven-java项目上的时,heroku cli识别出它是一个Java项目,并尝试构建它。它打印出它正在安装JDK 1.8,在大量终端输出之后,它说 maven-compiler-plugin配置源和目标显式标识Heroku文档指定为可接受的Java 10.0.2,并且在和中 我想我需要让Heroku在一开始就安装正确的JDK。我如何让Heroku获得并使用Java10?