我得到错误"线程中的异常" main" org.lwjgl.opengl.OpenGLException:无效的操作(1282)",它是什么?,我该如何修复它?

时间:2015-03-11 17:14:25

标签: java opengl lwjgl

我使用NetBeans 编程语言:Java 操作系统:Windows 8.1 x64

我尝试使用TheBennyBox制作游戏引擎 tutorial。我在第11部分中尝试运行我的项目,但收到此错误消息:

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

shader.java

public void compileShader()
{
    glLinkProgram(program);

    if(glGetProgram(program, GL_LINK_STATUS) == 0)
    {

        System.err.println(glGetShaderInfoLog(program, 1024));
        System.exit(1);
    }

    glValidateProgram(program);

    if(glGetProgram(program, GL_VALIDATE_STATUS) == 0)
    {

        System.err.println(glGetShaderInfoLog(program, 1024));
        System.exit(1);
    }

}

private void addProgram(String text, int type)
{
    int shader = glCreateShader(type);

    if(shader == 0)
    {
        System.err.println("Shader creation failed: Could not find valid file location when adding shader");
        System.exit(1);
    }
    glShaderSource(shader, text);
    glCompileShader(shader);

    if(glGetShader(shader, GL_COMPILE_STATUS) == 0)
    {

        System.err.println(glGetShaderInfoLog(shader, 1024));
        System.exit(1);
    }

    glAttachShader(program, shader);
}

public void setUniformi(String uniformName, int value)
{
    glUniform1i(uniforms.get(uniformName), value);
}

public void setUniformf(String uniformName, float value)
{
    glUniform1f(uniforms.get(uniformName), value);
}

public void setUniform(String uniformName, Vector3f value)
{
    glUniform3f(uniforms.get(uniformName), value.getX(), value.getY(), value.getZ());
}

public void setUniform(String uniformName, Matrix4f value)
{
    glUniformMatrix4(uniforms.get(uniformName), true, Util.createFlippedBuffer(value));
}


  }

game.java

public void update()
{
    temp += Time.getDelta();

    shader.setUniformf("uniformFloat", (float)Math.abs(Math.sin(temp)));
}

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

}

我不知道它有什么错误,以及如何解决它? 如果你需要代码来帮助我在评论中解决这个问题。

1 个答案:

答案 0 :(得分:3)

来自OpenGL 3.3 Reference Pages

  

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

您可以使用render()的{​​{1}}方法绑定着色器程序:

Game

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

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

private void run() { // ... while(unprocessedTime > frameTime) { // ... game.update(); // ... } if(render) { render(); frames++; } // ... } private void render() { RenderUtil.clearScreen(); game.render(); Window.render(); } 之前调用game.update()(因此render())。{/ p>

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

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

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