Search code examples
javaopengllwjgl

Context error when using glCreateShader in LWJGL


It throws a FATAL ERROR when i try to create a shader.

Here is the code

glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

handle = glfwCreateWindow(800, 600, "Omlet", 0, 0);
if (handle == 0) {
    System.out.println("Failed to create GLFW window");
    glfwTerminate();
    System.exit(-1);
}

glfwMakeContextCurrent(handle);
glfwSetFramebufferSizeCallback(handle, (win, w, h) -> glViewport(0, 0, w, h));
glCreateShader(GL_VERTEX_SHADER);

And here is the error:

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.GL20C.glCreateShader(Native Method)
    at net.zyrafal.Main.main(Main.java:25)

I am using org.lwjgl.opengl.GL46C and org.lwjgl.glfw.GLFW


Solution

  • You are missing the call to GL.createCapabilities(). It is needed for LWJGL to obtain the function pointers for OpenGL functions from a thread-local context. Please see the code and explaining comments on https://www.lwjgl.org/guide :

    // This line is critical for LWJGL's interoperation with GLFW's
    // OpenGL context, or any context that is managed externally.
    // LWJGL detects the context that is current in the current thread,
    // creates the GLCapabilities instance and makes the OpenGL
    // bindings available for use.
    GL.createCapabilities();