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." 是一个明显的错误。