Java 尚未为当前线程设置GLCapabilities实例
我一直在尝试OpenGL,遵循ThinMatrix的教程。唯一不同的是他用的是lwjgl 2,我用的是lwjgl 3。我认为这将是一个很好的挑战,事实证明确实如此。上面说没有设置任何功能,但我很确定我已经设置了它们 基本上我得到的全部错误是Java 尚未为当前线程设置GLCapabilities实例,java,opengl,lwjgl,Java,Opengl,Lwjgl,我一直在尝试OpenGL,遵循ThinMatrix的教程。唯一不同的是他用的是lwjgl 2,我用的是lwjgl 3。我认为这将是一个很好的挑战,事实证明确实如此。上面说没有设置任何功能,但我很确定我已经设置了它们 基本上我得到的全部错误是 Exception in thread "main" java.lang.IllegalStateException: No GLCapabilities instance has been set for the current thread. at or
Exception in thread "main" java.lang.IllegalStateException: No GLCapabilities instance has been set for the current thread.
at org.lwjgl.opengl.GL.getCapabilities(GL.java:211)
at org.lwjgl.opengl.GL20.getInstance(GL20.java:378)
at org.lwjgl.opengl.GL20.glCreateShader(GL20.java:464)
at net.robharding.base.shaders.ShaderProgram.loadShader(ShaderProgram.java:67)
at net.robharding.base.shaders.ShaderProgram.<init>(ShaderProgram.java:17)
at net.robharding.base.shaders.StaticShader.<init>(StaticShader.java:9)
at net.robharding.base.engine.Display.init(Display.java:77)
at net.robharding.base.engine.Display.<init>(Display.java:31)
at net.robharding.base.MainComponent.main(MainComponent.java:8)
这是它要追溯到的方法
private static int loadShader(String file, int type) {
StringBuilder shaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null) {
shaderSource.append(line).append("\n");
}
reader.close();
} catch(IOException e) {
System.err.print("Count not read file!");
e.printStackTrace();
System.exit(-1);
}
int shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, shaderSource);
GL20.glCompileShader(shaderID);
if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
System.err.println("Could not compile shader!");
System.exit(-1);
}
return shaderID;
}
在创建上下文之前,代码尝试使用OpenGL 在构造函数中调用创建着色器的
init
方法,但在run
方法的开头创建上下文。要解决此问题,请将init
方法的调用移动到GL.createCapabilities()之后的run
方法代码>
还请注意,OpenGL上下文始终只与一个线程关联。所以所有OpenGL命令都必须从这一个线程发出。我真傻。修正:D谢谢
private static int loadShader(String file, int type) {
StringBuilder shaderSource = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null) {
shaderSource.append(line).append("\n");
}
reader.close();
} catch(IOException e) {
System.err.print("Count not read file!");
e.printStackTrace();
System.exit(-1);
}
int shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, shaderSource);
GL20.glCompileShader(shaderID);
if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
System.err.println("Could not compile shader!");
System.exit(-1);
}
return shaderID;
}