2017-06-05 76 views
-1

我目前正在学习使用OpenGl和lwjgl创建小型Java游戏。我目前正在为实体制作一个动画系统,但我遇到了一个问题。OpenGL和lwjgl动画无法正常工作

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类:

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; 
} 

回答

0

你必须在使用前初始化的OpenGL任何它的功能的。

在LWJGL2:

Display.setDisplayMode(new DisplayMode(800, 600)); 
Display.create(); 

在LWJGL3(基本上GLFW)你必须调用:

glfwInit(); 

如果你已经初始化OpenGL的你正试图从一个不同的线程中调用OpenGL的功能。

如果您在初始化调用之前尝试使用任何内容,也会出现相同的错误。

如果这无助于发布您的centext相关代码,即使glGenVertexArrays();导致问题“在当前线程中找不到OpenGL上下文”。是一个明显的错误。

+0

谢谢你的帮助。 – Simagdo