Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

java

opengl

lwjgl

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();
        }
like image 377
Jack Avatar asked Dec 26 '14 16:12

Jack


People also ask

How do I use wglmakecurrent in OpenGL?

Before you can use OpenGL, the context you created must be made current. This is done with the wglMakeCurrent function. This takes a DC and the HGLRC context. If there is already a current context, then this function will cause the old context to be replaced with the new.

How do I set the context of the LWJGL GL Class?

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. 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.

What is the purpose of the glcontext method in LWJGL?

This method is needed to set the context used by the LWJGL GL** classes under the hood. Since the latest nightly (3.0.0b #11) this no longer works, as the GLContext class no more exists.

Why can't I add WGL extensions to my OpenGL Project?

The key problem is this: the function you use to get WGL extensions is, itself, an OpenGL extension. Thus like any OpenGL function, it requires an OpenGL context to call it. So in order to get the functions we need to create a context, we have to... create a context.


1 Answers

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.

like image 141
Sri Harsha Chilakapati Avatar answered Sep 28 '22 08:09

Sri Harsha Chilakapati