2016-07-29 1 views
2

現在、LWJGLでOpenGLを学習しています。私は、インデックスを持つモデルをレンダリングしたいのですが、現れて例外が...ありLWJGL:要素配列バッファオブジェクトが無効の場合、オフセットを使用できません

私は私が知っているかはわからない「素子アレイバッファオブジェクトが無効になっているときのオフセットを使用することはできません」それはどういう意味ですか、私はインデックスバッファをモデルの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(); 
    } 
} 

STACKTRACE

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

モデルのレンダリング中に例外がスローされたようです。しかし、私は要素のバッファがバインドされていない理由を知らない... – user6656221

答えて

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

RawModelコンストラクタにあります。これが単なる入力ミスではない場合は、有効なvaoIdがバインドしようとしている場合model.getVaoID();

+0

こんにちは、ありがとう。私は一日前にそれを修正しましたが、答えに感謝します。 – user6656221

+0

まあ、私はあなたの質問が未回答であることを見出し、あなたの間違いがそれに答えたのを見た。 – eldo

+0

ええ、ありがとう、私は本当にうれしいです... – user6656221

関連する問題