在当前线程中找不到 OpenGL 上下文?龙王金格

No OpenGL context found in the current thread ? LWJGL

错误如下:

    at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)
    at org.lwjgl.opengl.GL20.glCreateShader(GL20.java:219)
    at com.evolve.shaders.ShaderProgram.loadShader(ShaderProgram.java:63)
    at com.evolve.shaders.ShaderProgram.<init>(ShaderProgram.java:17)
    at com.evolve.shaders.StaticShader.<init>(StaticShader.java:9)
    at com.evolve.main.Main.<init>(Main.java:28)
    at com.evolve.main.Main.main(Main.java:46)

错误中有 class:

主线:

    package com.evolve.main;

    import org.lwjgl.opengl.Display;
    import org.lwjgl.opengl.GL11;

    import com.evolve.display.DisplayManager;
    import com.evolve.display.Fps;
    import com.evolve.input.KeyboardInput;
    import com.evolve.input.MouseInput;
    import com.evolve.model.Loader;
    import com.evolve.model.RawModel;
    import com.evolve.model.TextureModel;
    import com.evolve.render.Camera;
    import com.evolve.render.Renderer;
    import com.evolve.shaders.StaticShader;
    import com.evolve.textures.ModelTexture;

    public class Main {

        private static boolean isRunning = false;
        Camera camera;

        /*********VAO / VBO*************/
        Loader loader = new Loader();
        Renderer renderer = new Renderer();

        /**********SHADERS*************/
        StaticShader shader = new StaticShader();

        float[] vertices = {
                -0.5f, 0.5f, 0f,
                -0.5f, -0.5f, 0f,
                0.5f, -0.5f, 0f,
                0.5f, 0.5f, 0f,
            };  

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

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

        public static void main(String[] args)
        {
            Main main = new Main();
            main.start();
        }

        public Main()
        {
            Time.startTime();   

            DisplayManager.createDisplay(1200, 840, "Evolve", "v0.2");
            System.out.println(DisplayManager.getWidth() + " " + DisplayManager.getHeight());

            camera = new Camera(new Vector3f(0, 0, 0));
            camera.setPerspectiveProjection(70.0f, 0.1f, 1000.0f);

            Util.glDepthCull(true);
            Util.initGL();          
        }

        //start the game
        public void start()
        {
            isRunning = true;

            //FPS statistics
            Fps.getDelta();
            Fps.lastFPS = Fps.getTime();

            //getting infomations
                System.out.println("OpenGL version: " + Util.getOpenGLVersion());

                System.out.println("OPEN SUCCESSFUL");

                System.out.println("Opened in: " + Time.endTime() + " sec(s).");
            loop();
        }

        //stop the game
        public void stop()
        {
            isRunning = false;

        }

        //core loop
        public void loop()
        {
            while(isRunning){
                if(Display.isCloseRequested())
                    stop();

                //FPS
                    Fps.updateFPS();
                    Fps.getDelta();


                ////// Input Listener /////
                    KeyboardInput.getKeyboardInput();
                    MouseInput.getMouseMovement();
                ////// END Input Li. /////

                //rendering mesh and stuff..
                    GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());
                    cameraRender();

                //updating the display
                    DisplayManager.updateDisplay();

            }   
            exit();
        }

        //exit window and stuff..
        public void exit()
        {
            //close display, memory and others...
            DisplayManager.destroyDisplay();
            shader.cleanUp();
            loader.cleanUp();
            System.out.println("QUIT SUCCESSFUL");
            System.exit(0);
        }

        //camera settings
        public void cameraRender()
        {
            renderer.prepare();
            shader.start();
            Util.clearScreen();
            camera.getPerspectiveProjection();
            camera.update();

            render2D();
            render3D();

            shader.stop();
        }

        public void render2D()
        {

        }

        public void render3D()
        {   

            renderer.render(model);
        }

    }

`

静态着色器

    private static final String VERTEX_FILE = "src/com/evolve/shaders/vertexShader.txt";
    private static final String FRAGMENT_FILE = "src/com/evolve/shaders/fragmentShader.txt";

     public StaticShader() {
            super(VERTEX_FILE, FRAGMENT_FILE);
        }

        @Override
        protected void bindAttributes() {
            super.bindAttribute(0, "position");
        }`

和 ShaderProgram :

    private int programID;
    private int vertexShaderID;
    private int fragmentShaderID;

    public ShaderProgram(String vertexFile,String fragmentFile){
        vertexShaderID = loadShader(vertexFile,GL20.GL_VERTEX_SHADER);
        fragmentShaderID = loadShader(fragmentFile,GL20.GL_FRAGMENT_SHADER);
        programID = GL20.glCreateProgram();
        GL20.glAttachShader(programID, vertexShaderID);
        GL20.glAttachShader(programID, fragmentShaderID);
        bindAttributes();
        GL20.glLinkProgram(programID);
        GL20.glValidateProgram(programID);
    }

    public void start(){
        GL20.glUseProgram(programID);
    }

    public void stop(){
        GL20.glUseProgram(0);
    }

    public void cleanUp(){
        stop();
        GL20.glDetachShader(programID, vertexShaderID);
        GL20.glDetachShader(programID, fragmentShaderID);
        GL20.glDeleteShader(vertexShaderID);
        GL20.glDeleteShader(fragmentShaderID);
        GL20.glDeleteProgram(programID);
    }

    protected abstract void bindAttributes();

    protected void bindAttribute(int attribute, String variableName){
        GL20.glBindAttribLocation(programID, attribute, variableName);
    }

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

}

`

我卡住了一段时间(明白了吗?),我不知道为什么 lwjgl 抛出这个错误。我真的需要一些帮助!非常感谢

Main class 的构造函数中,尝试将 StaticShader 对象的初始化移动到 DisplayManager.createDisplay(...):

之后的构造函数主体中
StaticShader shader;// = new StaticShader();

public Main() {
    Time.startTime();   

    DisplayManager.createDisplay(1200, 840, "Evolve", "v0.2");
    System.out.println(DisplayManager.getWidth() + " " + DisplayManager.getHeight());

    shader = new StaticShader();  //<--- like this

    camera = new Camera(new Vector3f(0, 0, 0));
    camera.setPerspectiveProjection(70.0f, 0.1f, 1000.0f);

    Util.glDepthCull(true);
    Util.initGL();          
}

根据您的 LoaderRenderer class 中的内容,您可能需要对它们执行相同的操作。

我不知道你的 DisplayManager.createDisplay(...) 方法到底发生了什么,因为没有为它发布代码(截至撰写本文时),但我假设它有类似的东西:

//pre LWJGL 3
Display.setDisplayMode(new DisplayMode(width, height));
Display.create();

或:

//LWJGL 3
GLFW.glfwCreateWindow(width, height, "Window Title", NULL, NULL);

如果是这种情况,那么您得到异常的原因是因为在您调用 DisplayManager.createDisplay(...) 之前线程没有分配 OpenGL 上下文,并且在调用 [= 之前​​您需要一个当前的 OpenGL 上下文20=].

Display.create() (in pre-LWJGL 3) or GLFW.glfwCreateWindow()(在 LWJGL 3 中)创建该 OpenGL 上下文。