Lwjgl 3, How to get OpenGL context current in the current thread?

13,883

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.

Share:
13,883
Jack
Author by

Jack

Updated on June 08, 2022

Comments

  • Jack
    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
      Andon M. Coleman over 9 years
      It 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
      Reto Koradi over 9 years
      Can you show the code where you create your window and context?
    • derhass
      derhass over 9 years
      @Jack: seeing your main would be interesting, too.
    • Jack
      Jack over 9 years
      Ok, I added that in above.
  • user2084865
    user2084865 over 8 years
    That 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
    javac over 8 years
    @user2084865 The website already uses the new API of the beta version, see the edit of the other answer.
  • user2084865
    user2084865 over 8 years
    Yep, that solved it for me. Tried it already, but anyways, thanks ;-)
  • Kaiser Keister
    Kaiser Keister about 5 years
    The original post has a "java" tag, so why is your useless answer in Kotlin?