2016-07-29 35 views
2

我目前正在學習使用LWJGL的openGL。我想渲染指數的車型,但有證據顯示了一個例外......LWJGL:元素陣列緩衝區對象禁用時無法使用偏移量

我不知道,如果我知道「when元素數組緩衝區對象是殘疾人無法使用偏移」這意味着什麼,但我認爲我將索引緩衝區綁定到模型的vao。 這裏是我的代碼:

渲染

public class Renderer { 


    public void prepare(){ 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glClearColor(1, 0, 0, 1); 
    } 


    public void render(RawModel model){ 
     GL30.glBindVertexArray(model.getVaoID()); 
     GL20.glEnableVertexAttribArray(0); 
     GL11.glDrawElements(GL11.GL_TRIANGLES, model.getVertexCount(), GL11.GL_UNSIGNED_INT, 0); 
     GL20.glDisableVertexAttribArray(0); 
     GL30.glBindVertexArray(0); 
    } 
} 

裝載機

public class Loader { 


    private List<Integer> vaoIDs = new ArrayList<Integer>(); 
    private List<Integer> vboIDs = new ArrayList<Integer>(); 


    public RawModel loadToVAO(float[] positions, int[] indices){ 
     int vaoID = createVAO(); 
     bindIndicesBuffer(indices); 
     storeDataInAttributeList(0, positions); 
     unbindVAO(); 
     return new RawModel(vaoID, indices.length); 

    } 


    private int createVAO(){ 
     int vaoID = GL30.glGenVertexArrays(); 
     vaoIDs.add(vaoID); 
     GL30.glBindVertexArray(vaoID); 
     return vaoID; 
    } 


    private void storeDataInAttributeList(int attributeNumber, float[] data){ 
     int vboID = GL15.glGenBuffers(); 
     vboIDs.add(vboID); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); 
     FloatBuffer buffer = storeDataInFloatBuffer(data); 
     GL15.glBufferData(GL15.GL_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); 
     GL20.glVertexAttribPointer(attributeNumber, 3, GL11.GL_FLOAT, false, 0, 0); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
    } 


    private FloatBuffer storeDataInFloatBuffer(float[] data){ 
     FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length); 
     buffer.put(data); 
     buffer.flip(); 
     return buffer; 
    } 


    private void bindIndicesBuffer(int[] indices){ 
     int vboID = GL15.glGenBuffers(); 
     vboIDs.add(vboID); 
     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, vboID); 
     IntBuffer buffer = storeDataInIntBuffer(indices); 
     GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, buffer, GL15.GL_STATIC_DRAW); 
    } 


    private IntBuffer storeDataInIntBuffer(int[] data){ 
     IntBuffer buffer = BufferUtils.createIntBuffer(data.length); 
     buffer.put(data); 
     buffer.flip(); 
     return buffer; 
    } 


    private void unbindVAO(){ 
     GL30.glBindVertexArray(0); 
    } 


    public void cleanUp(){ 
     for(int vaoID : vaoIDs){ 
      GL30.glDeleteVertexArrays(vaoID); 
     } 
     for(int vboID : vboIDs){ 
      GL15.glDeleteBuffers(vboID); 
     } 
    } 
} 

型號

public class RawModel { 

    private int vaoID; 
    private int vertexCount; 

    public RawModel(int vaoId, int vertexCount){ 
     this.vaoID = vaoID; 
     this.vertexCount = vertexCount; 
    } 

    public int getVaoID() { 
     return vaoID; 
    } 

    public int getVertexCount() { 
     return vertexCount; 
    } 

} 

主要

public class MainGameLoop { 

    public static void main(String[] args) { 

     DisplayManager.openDisplay(); 
     Loader loader = new Loader(); 
     Renderer renderer = new Renderer(); 

     float[] vertices = { -0.5f, 0.5f, 0f, 
          -0.5f, -0.5f, 0f, 
          0.5f, -0.5f, 0f, 
          0.5f, 0.5f, 0f 
     }; 

     int[] indices = { 0, 1, 3, 
          3, 1, 2 
     }; 

     RawModel model = loader.loadToVAO(vertices, indices); 


     while(!Display.isCloseRequested()){ 
      renderer.prepare(); 
      renderer.render(model); 

      DisplayManager.updateDisplay(); 
     } 

     loader.cleanUp(); 
     DisplayManager.closeDisplay(); 
    } 
} 

堆棧跟蹤

Exception in thread "main" org.lwjgl.opengl.OpenGLException: Cannot use offsets when Element Array Buffer Object is disabled 
at org.lwjgl.opengl.GLChecks.ensureElementVBOenabled(GLChecks.java:89) 
at org.lwjgl.opengl.GL11.glDrawElements(GL11.java:1117) 
at renderEngine.Renderer.render(Renderer.java:20) 
at tester.MainGameLoop.main(MainGameLoop.java:33) 

它已有4天了,我得到這個錯誤,我不知道我做錯了。

任何幫助和答案將不勝感激,謝謝。

+1

我會建議提供完整的stacktrace,以幫助別人固定原因。 – ajoberstar

+0

謝謝,增加了stacktrace。似乎在嘗試渲染模型時拋出異常。但我不知道爲什麼元素緩衝區沒有綁定... – user6656221

回答

0
this.vaoID = vaoID; // constructor takes vaoId but you make vaoID = valID 

在您的RawModel的構造函數中。如果這不僅僅是一個錯字(這裏),那麼你有沒有有效的vaoId,當試圖綁定model.getVaoID();

+0

嗨,謝謝。我在一天前解決了它,但感謝您的答案。 – user6656221

+0

嗯,我剛剛發現你的問題沒有答案,並看到你的錯誤如此回答。 – eldo

+0

對,非常感謝,我現在真的很開心... – user6656221