OpenGL 和 lwjgl 动画不工作
OpenGL and lwjgl Animation not working
我目前正在学习使用 OpenGl 和 lwjgl 创建小型 java 游戏。我目前正在为实体开发动画系统,但我 运行 遇到了问题。
Exception in thread "main" java.lang.RuntimeException: No OpenGL context found in the current thread.
at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)
at org.lwjgl.opengl.GL30.glGenVertexArrays(GL30.java:1548)
at de.simagdo.simagdoRPG.openglObjects.Vao.create(Vao.java:21)
at de.simagdo.simagdoRPG.animation.models.AnimatedModelLoader.createVao(AnimatedModelLoader.java:73)
at de.simagdo.simagdoRPG.animation.models.AnimatedModelLoader.loadEntity(AnimatedModelLoader.java:28)
at de.simagdo.simagdoRPG.engineTester.SceneLoader.loadScene(SceneLoader.java:30)
at de.simagdo.simagdoRPG.engineTester.MainGameLoop.main(MainGameLoop.java:35)
这是我遇到的错误。
VAO Class:
private static final int BYTES_PER_FLOAT = 4;
private static final int BYTES_PER_INT = 4;
public final int id;
private List<Vbo> dataVbos = new ArrayList<>();
private Vbo indexVbo;
private int indexCount;
public static Vao create() {
int id = GL30.glGenVertexArrays();
return new Vao(id);
}
private Vao(int id) {
this.id = id;
}
public int getIndexCount() {
return indexCount;
}
public void bind(int... attributes) {
bind();
for (int i : attributes) {
GL20.glEnableVertexAttribArray(i);
}
}
public void unbind(int... attributes) {
for (int i : attributes) {
GL20.glDisableVertexAttribArray(i);
}
unbind();
}
public void createIndexBuffer(int[] indices) {
this.indexVbo = Vbo.create(GL15.GL_ELEMENT_ARRAY_BUFFER);
indexVbo.bind();
indexVbo.storeData(indices);
this.indexCount = indices.length;
}
public void createAttribute(int attribute, float[] data, int attrSize) {
Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
dataVbo.bind();
dataVbo.storeData(data);
GL20.glVertexAttribPointer(attribute, attrSize, GL11.GL_FLOAT, false, attrSize * BYTES_PER_FLOAT, 0);
dataVbo.unbind();
dataVbos.add(dataVbo);
}
public void createIntAttribute(int attribute, int[] data, int attrSize) {
Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
dataVbo.bind();
dataVbo.storeData(data);
GL30.glVertexAttribIPointer(attribute, attrSize, GL11.GL_INT, attrSize * BYTES_PER_INT, 0);
dataVbo.unbind();
dataVbos.add(dataVbo);
}
public void delete() {
GL30.glDeleteVertexArrays(id);
for (Vbo vbo : dataVbos) {
vbo.delete();
}
indexVbo.delete();
}
private void bind() {
GL30.glBindVertexArray(id);
}
private void unbind() {
GL30.glBindVertexArray(0);
}
方法,我用的地方:
private static Vao createVao(MeshData data) {
Vao vao = Vao.create();
vao.bind();
vao.createIndexBuffer(data.getIndices());
vao.createAttribute(0, data.getVertices(), 3);
vao.createAttribute(1, data.getTextureCoords(), 2);
vao.createAttribute(2, data.getNormals(), 3);
vao.createIntAttribute(3, data.getJointIds(), 3);
vao.createAttribute(4, data.getVertexWeights(), 3);
vao.unbind();
return vao;
}
您必须先初始化 opengl,然后才能使用它的任何功能。
在 LWJGL2 中:
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
在 LWJGL3(基本上是 GLFW)中你必须调用:
glfwInit();
如果您已经初始化了 opengl,那么您正在尝试从不同的线程调用 opengl 函数。
如果您在 init 调用之前尝试使用任何东西,也会出现同样的错误。
如果这没有帮助 post 你的 centext 相关代码,即使 glGenVertexArrays();导致问题 "No OpenGL context found in the current thread." 是一个明显的错误。
我目前正在学习使用 OpenGl 和 lwjgl 创建小型 java 游戏。我目前正在为实体开发动画系统,但我 运行 遇到了问题。
Exception in thread "main" java.lang.RuntimeException: No OpenGL context found in the current thread.
at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)
at org.lwjgl.opengl.GL30.glGenVertexArrays(GL30.java:1548)
at de.simagdo.simagdoRPG.openglObjects.Vao.create(Vao.java:21)
at de.simagdo.simagdoRPG.animation.models.AnimatedModelLoader.createVao(AnimatedModelLoader.java:73)
at de.simagdo.simagdoRPG.animation.models.AnimatedModelLoader.loadEntity(AnimatedModelLoader.java:28)
at de.simagdo.simagdoRPG.engineTester.SceneLoader.loadScene(SceneLoader.java:30)
at de.simagdo.simagdoRPG.engineTester.MainGameLoop.main(MainGameLoop.java:35)
这是我遇到的错误。
VAO Class:
private static final int BYTES_PER_FLOAT = 4;
private static final int BYTES_PER_INT = 4;
public final int id;
private List<Vbo> dataVbos = new ArrayList<>();
private Vbo indexVbo;
private int indexCount;
public static Vao create() {
int id = GL30.glGenVertexArrays();
return new Vao(id);
}
private Vao(int id) {
this.id = id;
}
public int getIndexCount() {
return indexCount;
}
public void bind(int... attributes) {
bind();
for (int i : attributes) {
GL20.glEnableVertexAttribArray(i);
}
}
public void unbind(int... attributes) {
for (int i : attributes) {
GL20.glDisableVertexAttribArray(i);
}
unbind();
}
public void createIndexBuffer(int[] indices) {
this.indexVbo = Vbo.create(GL15.GL_ELEMENT_ARRAY_BUFFER);
indexVbo.bind();
indexVbo.storeData(indices);
this.indexCount = indices.length;
}
public void createAttribute(int attribute, float[] data, int attrSize) {
Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
dataVbo.bind();
dataVbo.storeData(data);
GL20.glVertexAttribPointer(attribute, attrSize, GL11.GL_FLOAT, false, attrSize * BYTES_PER_FLOAT, 0);
dataVbo.unbind();
dataVbos.add(dataVbo);
}
public void createIntAttribute(int attribute, int[] data, int attrSize) {
Vbo dataVbo = Vbo.create(GL15.GL_ARRAY_BUFFER);
dataVbo.bind();
dataVbo.storeData(data);
GL30.glVertexAttribIPointer(attribute, attrSize, GL11.GL_INT, attrSize * BYTES_PER_INT, 0);
dataVbo.unbind();
dataVbos.add(dataVbo);
}
public void delete() {
GL30.glDeleteVertexArrays(id);
for (Vbo vbo : dataVbos) {
vbo.delete();
}
indexVbo.delete();
}
private void bind() {
GL30.glBindVertexArray(id);
}
private void unbind() {
GL30.glBindVertexArray(0);
}
方法,我用的地方:
private static Vao createVao(MeshData data) {
Vao vao = Vao.create();
vao.bind();
vao.createIndexBuffer(data.getIndices());
vao.createAttribute(0, data.getVertices(), 3);
vao.createAttribute(1, data.getTextureCoords(), 2);
vao.createAttribute(2, data.getNormals(), 3);
vao.createIntAttribute(3, data.getJointIds(), 3);
vao.createAttribute(4, data.getVertexWeights(), 3);
vao.unbind();
return vao;
}
您必须先初始化 opengl,然后才能使用它的任何功能。
在 LWJGL2 中:
Display.setDisplayMode(new DisplayMode(800, 600));
Display.create();
在 LWJGL3(基本上是 GLFW)中你必须调用:
glfwInit();
如果您已经初始化了 opengl,那么您正在尝试从不同的线程调用 opengl 函数。
如果您在 init 调用之前尝试使用任何东西,也会出现同样的错误。
如果这没有帮助 post 你的 centext 相关代码,即使 glGenVertexArrays();导致问题 "No OpenGL context found in the current thread." 是一个明显的错误。