Lwjgl 3, How to get OpenGL context current in the current thread?
Add a call to GLContext.createFromCurrent()
at the end of the createWindow
method.
This method is needed to set the context used by the LWJGL GL** classes under the hood.
EDIT:
Since the latest nightly (3.0.0b #11) this no longer works, as the GLContext
class no more exists. Instead, add GL.createCapabilities()
at the end of the createWindow
method.
Jack
Updated on June 08, 2022Comments
-
Jack almost 2 years
I am using OpenGL in LWJGL 3 and I get the following error;
Exception in thread "main" java.lang.IllegalStateException: There is no OpenGL context current in the current thread. at org.lwjgl.opengl.GL.getCapabilities(GL.java:157) at org.lwjgl.opengl.GL11.getInstance(GL11.java:1390) at org.lwjgl.opengl.GL11.glClearColor(GL11.java:1842) at com.base.engine.RenderUtil.initGraphics(RenderUtil.java:13) at com.base.engine.Main.<init>(Main.java:14) at com.base.engine.Main.main(Main.java:24)
This is the RenderUtil class where initGraphics is called from the constructor of my main class. I have also tried to call initGraphics after creating a window with GLFW which has also generated a similar error message.
package com.base.engine; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL30.*; public class RenderUtil { public static void clearScreen() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } public static void initGraphics() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glFrontFace(GL_CW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glEnable(GL_FRAMEBUFFER_SRGB); } }
Also, I am not using multithreading. To create a window I call the method
Window.createWindow(1366, 768, "Test");
from my main method. ``` private static Long window;public static String createWindow(int width, int height, String title) { if (GLFW.glfwInit() == 0) { return "GLFW failed to initialise."; } GLFW.glfwWindowHint(GLFW.GLFW_SAMPLES, 4); window = GLFW.glfwCreateWindow(width, height, title, GLFW.glfwGetPrimaryMonitor(), 0); if (window == null) { GLFW.glfwTerminate(); return "Failed to create window."; } GLFW.glfwMakeContextCurrent(window); return "GLFW has established a window."; }
I have tried putting `RenderUtil.initGraphics();` two different position in my main method, both resulting in errors. private boolean isRunning = false; private Game game; // This is the constructor public Main() { // Pos 1 - RenderUtil.initGraphics(); isRunning = false; game = new Game(); } public static void main(String[] args) { System.out.println(Window.createWindow(1366, 768, "Test")); // Pos 2 - RenderUtil.initGraphics(); Main game = new Main(); game.start(); }
-
Andon M. Coleman over 9 yearsIt should already be current unless you created your context in a different thread. Nevertheless, each window system has its own
...MakeCurrent
function to do this. LWJGL is no different,GLContext.makeCurrent (long)
wraps the platform specific stuff. -
Reto Koradi over 9 yearsCan you show the code where you create your window and context?
-
derhass over 9 years@Jack: seeing your
main
would be interesting, too. -
Jack over 9 yearsOk, I added that in above.
-
-
user2084865 over 8 yearsThat is not helpful, the official example gives the same error for me. It isn't compilable even with latest lwjgl (3.0.0a build 1)...
-
javac over 8 years@user2084865 The website already uses the new API of the beta version, see the edit of the other answer.
-
user2084865 over 8 yearsYep, that solved it for me. Tried it already, but anyways, thanks ;-)
-
Kaiser Keister about 5 yearsThe original post has a "java" tag, so why is your useless answer in Kotlin?