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

Sup*_*oll -1 java opengl 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
Run Code Online (Sandbox Code Playgroud)

jav*_*vac 6

来自OpenGL 3.3 参考页面:

如果没有当前程序对象,则生成 GL_INVALID_OPERATION。

您在以下render()方法中绑定您的着色器程序Game:

public void render()
{
    shader.bind();
    mesh.draw();
}
Run Code Online (Sandbox Code Playgroud)

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

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

private void render()
{
    RenderUtil.clearScreen();
    game.render();
    Window.render();
}
Run Code Online (Sandbox Code Playgroud)

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

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

这不是真正的问题,因为从程序的第二帧开始,所有内容都将完美运行。但是,您可能打开了调试模式,这意味着 LWJGL 不会默默地忽略 OpenGL 错误,而是抛出异常。

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