代码之家  ›  专栏  ›  技术社区  ›  SuperTroll

线程“main”org.lwjgl.opengl.OpenGLException:无效操作(1282)-lwjgl

  •  -1
  • SuperTroll  · 技术社区  · 10 年前

    我尝试使用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
    
    1 回复  |  直到 4 年前
        1
  •  6
  •   javac    10 年前

    OpenGL 3.3 Reference Pages :

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

    将着色器程序绑定到 render() 方法 Game :

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

    然而,如 MainComponent 教程11中的课程:

    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错误,而是抛出异常。

    因此,您可以关闭调试模式,或者根据我的建议,在 游戏 构造函数,而不是每一帧。只要您只有一个着色器程序,它就可以完美工作。