我使用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();
}
}
我不知道它有什么错误,以及如何解决它? 如果你需要代码来帮助我在评论中解决这个问题。
答案 0 :(得分:3)
如果没有当前的程序对象,则生成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
构造函数的末尾而不是每一帧绑定着色器程序一次。只要您只有一个着色器程序,它就能完美运行。