没有为当前线程设置GLCapabilities实例

时间:2016-02-24 12:50:26

标签: java opengl lwjgl

我一直在尝试OpenGL,遵循ThinMatrix的教程。我唯一不同的是他使用lwjgl 2并且我使用3.我认为这将是一个很好的挑战,并且它已经被证明是。它说已经没有设定glcapabilities,但我很确定我已经设置了它们!

基本上我得到的完整错误是

Exception in thread "main" java.lang.IllegalStateException: No GLCapabilities instance has been set for the current thread.
at org.lwjgl.opengl.GL.getCapabilities(GL.java:211)
at org.lwjgl.opengl.GL20.getInstance(GL20.java:378)
at org.lwjgl.opengl.GL20.glCreateShader(GL20.java:464)
at net.robharding.base.shaders.ShaderProgram.loadShader(ShaderProgram.java:67)
at net.robharding.base.shaders.ShaderProgram.<init>(ShaderProgram.java:17)
at net.robharding.base.shaders.StaticShader.<init>(StaticShader.java:9)
at net.robharding.base.engine.Display.init(Display.java:77)
at net.robharding.base.engine.Display.<init>(Display.java:31)
at net.robharding.base.MainComponent.main(MainComponent.java:8)

对我来说,这没有任何意义,因为我做了GL.CreateCapabilities();,我无法在网上找到有关此错误的任何内容...

package net.robharding.base.engine;
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

import net.robharding.base.shaders.StaticShader;

import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.system.MemoryUtil.*;

public class Display {

    private String title;
    private int width, height;

    @SuppressWarnings("unused")
    private GLFWErrorCallback errorCallback;
    @SuppressWarnings("unused")
    private GLFWKeyCallback keyCallback;

    private long windowID;

    private Loader loader;
    private Renderer renderer;
    private StaticShader shader;

    public Display(String title, int width, int height) {
        this.title = title;
        this.width = width;
        this.height = height;

        init();
    }

    private void keyPressed(int key, int scancode, int mods) {

    }

    private void keyReleased(int key, int scancode, int mods) {
        if(key == GLFW_KEY_ESCAPE) 
            glfwSetWindowShouldClose(windowID, GLFW_TRUE);
    }

    private void init() {
        // Setup an error callback. The default implementation
        // will print the error message in System.err.
        glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err));

        if(glfwInit() != GLFW_TRUE)
            throw new IllegalStateException("Unable to initialize GLFW");

        glfwDefaultWindowHints();
        glfwWindowHint(GLFW_VISIBLE, GLFW_TRUE);
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

        windowID = glfwCreateWindow(width, height, title, NULL, NULL);
        if(windowID == NULL)
            throw new RuntimeException("Failed to create the GLFW window");

        glfwSetKeyCallback(windowID, keyCallback = new GLFWKeyCallback() {
            @Override
            public void invoke(long window, int key, int scancode, int action, int mods) {
                if(action == GLFW_PRESS)
                     keyPressed(key, scancode, mods);
                else if(action == GLFW_RELEASE)
                    keyReleased(key, scancode, mods);
            }
        });

        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
        glfwSetWindowPos(windowID, (vidmode.width() - width) / 2, (vidmode.height() - height) / 2);

        glfwMakeContextCurrent(windowID);
        glfwSwapInterval(1);

        loader = new Loader();
        renderer = new Renderer();
        shader = new StaticShader();

        glfwShowWindow(windowID);
    }

    public void run() {
        GL.createCapabilities();

        GL11.glViewport(0, 0, width, height);

        float[] vertices = {
                -0.5f, 0.5f, 0, // V1
                -0.5f, -0.5f, 0, // V2
                0.5f, -0.5f, 0, // V3
                0.5f, 0.5f, 0 // V4
        };

        int[] indices = {
                0, 1, 3, 
                3, 2, 1
        };

        RawModel model = loader.loadToVAO(vertices, indices);

        while(glfwWindowShouldClose(windowID) == GLFW_FALSE) {
            renderer.prepare();

            shader.start();
            renderer.render(model);
            shader.stop();

            glfwSwapBuffers(windowID);

            glfwPollEvents();
        }

        shader.cleanUp();
        loader.cleanUp();
    }

}

以下是追溯的方法。

    private static int loadShader(String file, int type) {
    StringBuilder shaderSource = new StringBuilder();
    try {
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line;
        while((line = reader.readLine()) != null) {
            shaderSource.append(line).append("\n");
        }
        reader.close();
    } catch(IOException e) {
        System.err.print("Count not read file!");
        e.printStackTrace();
        System.exit(-1);
    }

    int shaderID = GL20.glCreateShader(type);
    GL20.glShaderSource(shaderID, shaderSource);
    GL20.glCompileShader(shaderID);
    if(GL20.glGetShaderi(shaderID,  GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
        System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
        System.err.println("Could not compile shader!");
        System.exit(-1);
    }
    return shaderID;
}

1 个答案:

答案 0 :(得分:1)

您的代码在创建上下文之前尝试使用OpenGL。

在构造函数中调用创建着色器的init方法,但是在run方法的开头创建了上下文。要解决此问题,请在init之后将run方法的调用移至GL.createCapabilities();方法。

请注意,OpenGL上下文始终与一个线程关联。因此,必须从这一个线程发出所有OpenGL命令。