为什么 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 函数,您正在尝试使用 - glBegin
和 glVertex2f
.
错误消息提示:
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_MAJOR
和 GLFW_CONTEXT_VERSION_MINOR
没有指定要使用哪个版本的 GLFW 本机库,但是 OpenGL 上下文版本 GLFW 将从 OS/driver 请求下一次调用 glfwCreateWindow()
.
创建的 OpenGL 上下文
使用现代 OpenGL 或请求较低的 OpenGL 版本,例如2.1,通过省略 glfwWindowHint()
调用。在这种情况下,由驱动程序提供给您的 OpenGL 上下文版本决定。在 Windows(使用 NVidia)上,它将是支持的最高可用 OpenGL 兼容版本(例如 4.6)。在 macOS 上它将是 2.1.
我用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
.
这是我的代码:
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 函数,您正在尝试使用 - glBegin
和 glVertex2f
.
错误消息提示:
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_MAJOR
和 GLFW_CONTEXT_VERSION_MINOR
没有指定要使用哪个版本的 GLFW 本机库,但是 OpenGL 上下文版本 GLFW 将从 OS/driver 请求下一次调用 glfwCreateWindow()
.
使用现代 OpenGL 或请求较低的 OpenGL 版本,例如2.1,通过省略 glfwWindowHint()
调用。在这种情况下,由驱动程序提供给您的 OpenGL 上下文版本决定。在 Windows(使用 NVidia)上,它将是支持的最高可用 OpenGL 兼容版本(例如 4.6)。在 macOS 上它将是 2.1.