线程异常 "main" org.lwjgl.opengl.OpenGLException: 无效操作 (1282) - LWJGL

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Invalid operation (1282) - LWJGL

我尝试使用 lwjgl 创建游戏。我做错了什么并在下面出现错误。我该如何解决?它究竟意味着什么?

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Invalid operation (1282)
at org.lwjgl.opengl.Util.checkGLError(Util.java:59)
at org.lwjgl.opengl.GL20.glUniform1f(GL20.java:338)
at com.base.engine.Shader.setUniformf(Shader.java:119)
at com.base.engine.Game.update(Game.java:63)
at com.base.engine.MainComponent.run(MainComponent.java:85)
at com.base.engine.MainComponent.start(MainComponent.java:38)
at com.base.engine.MainComponent.main(MainComponent.java:131)
Java Result: 1

来自OpenGL 3.3 Reference Pages:

GL_INVALID_OPERATION is generated if there is no current program object.

您在 Gamerender() 方法中绑定您的着色器程序:

public void render()
{
    shader.bind();
    mesh.draw();
}

但是,如教程 11 中的 MainComponent class 所示:

private void run()
{
    // ...
        while(unprocessedTime > frameTime)
        {
            // ...
            game.update();
            // ...
        }
        if(render)
        {
            render();
            frames++;
        }
        // ...
}

private void render()
{
    RenderUtil.clearScreen();
    game.render();
    Window.render();
}

此处 game.update()render() 之前被调用(因此 game.render())。

因为着色器程序只在game.render()中绑定,在game.update()的第一次调用时没有程序绑定,这意味着GL_INVALID_OPERATION被抛出。

这不是真正的问题,因为从第二帧开始,程序就被绑定了,所以从那里一切都会完美地工作。但是,您可能已打开调试模式,这意味着 LWJGL 不会默默地忽略 OpenGL 错误,而是抛出异常。

因此您可以关闭调试模式,或者我建议您在 Game 构造函数的末尾绑定一次着色器程序,而不是每帧绑定一次。只要你只有一个着色器程序,它就可以完美运行。