Jack
Jack

Reputation: 61

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

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();
        }

Upvotes: 6

Views: 15226

Answers (3)

Alex
Alex

Reputation: 591

I know that this thread is 4 years old but if someone of you still needs a solution here you go:

import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

public class Main {
private static long window = 0;

public static void main(String[] args) {
    if(!GLFW.glfwInit()) {
        throw new RuntimeException("Cannot initialize OPenGL");
    }

    window = GLFW.glfwCreateWindow(1024, 764, "Ya yeet", 0, 0);
    if(0 == window) {
        GLFW.glfwTerminate();
        throw new RuntimeException("Cannot create window");
    }

    GLFW.glfwMakeContextCurrent(window);
    GL.createCapabilities();

    String glVersion = GL11.glGetString(GL11.GL_VERSION);
    System.out.println(glVersion);
}
}

Upvotes: 0

kles4eko
kles4eko

Reputation: 793

To init and use LWJGL 3 you need to do next (code in Kotlin):

import org.lwjgl.glfw.GLFW
import org.lwjgl.opengl.GL
import org.lwjgl.opengl.GL11
import org.lwjgl.system.MemoryUtil.NULL


class VersionInfo {

    var window: Long = NULL

    fun run() {
        initGl()

        // use openGL
        val glVersion = GL11.glGetString(GL11.GL_VERSION)
        println("GL version: $glVersion")
    }

    private fun initGl() {
        // check GLFW
        if (!GLFW.glfwInit()) {
            throw IllegalStateException("Can not initialize GLFW")
        }
        // create window
        window = GLFW.glfwCreateWindow(1024, 764, "glfw", NULL, NULL)
        // check window
        if (NULL == window) {
            GLFW.glfwTerminate()
            throw IllegalStateException("Can not create new GLFW window")
        }
        // make GL context in the current thread
        GLFW.glfwMakeContextCurrent(window)
        // create capabilities
        GL.createCapabilities()
    }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            VersionInfo().run()
        }
    }
}

For more information, please, see official get-started guide: http://www.lwjgl.org/guide
Or Wiki: https://github.com/LWJGL/lwjgl3-wiki/wiki

Upvotes: -2

Sri Harsha Chilakapati
Sri Harsha Chilakapati

Reputation: 11940

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.

Upvotes: 15

Related Questions