2013-04-24 59 views
0

我有一個VBO與[x,y,z,textureX,textureY,.....]交錯,所有的工作和顯示都非常漂亮。我試圖找出在初始化和遺忘時可以做些什麼。VBO - 我可以在初始化時做些什麼?

這是我目前正在嘗試初始化。

編輯:修復了我的緩衝區解綁並移動了一些代碼。

 mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "vPosition"); 
     mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture"); 
     mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate"); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0)); 
     GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, interleavedBuffer.capacity() * BYTES_PER_FLOAT, interleavedBuffer, GLES20.GL_STATIC_DRAW);   

     //////////These are superfluous but I'd like to do them once since they never change///// 
     GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); 
     GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 
       INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT); 

     GLES20.glEnableVertexAttribArray(mPositionHandle); 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 
       INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0); 
     //////////////////////////////////////////////////// 

     mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1)); 
     GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 
       drawListBuffer.capacity() * BYTES_PER_SHORT, 
       drawListBuffer, 
       GLES20.GL_STATIC_DRAW); 
     GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);  

這是什麼工作。我混淆了一堆,但我不能告訴每個並條需要什麼,因爲它需要或我只是做錯了。任何幫助,將不勝感激。

public void draw(float[] mvpMatrix) { 
    GLES20.glUseProgram(mProgramHandle); 
    GLES20.glUniform1i(mTextureUniformHandle, 0); 

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, glBufferObjects.get(0)); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, glBufferObjects.get(1));   

    GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); 
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 
      INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT); 


    GLES20.glEnableVertexAttribArray(mPositionHandle); 
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 
      INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0); 

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

編輯:更新 - 如果我刪除

GLES20.glEnableVertexAttribArray(mTextureCoordinateHandle); 
    GLES20.glVertexAttribPointer(mTextureCoordinateHandle, mTextureCoordinateDataSize, GLES20.GL_FLOAT, false, 
      INTERLEAVED_VERTEX_TEXTURE_STRIDE, 3 * BYTES_PER_FLOAT); 


    GLES20.glEnableVertexAttribArray(mPositionHandle); 
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 
      INTERLEAVED_VERTEX_TEXTURE_STRIDE, 0); 

從我的draw(),它拋出一個gl_draw_error_checks:418:GL_INVALID_OPERATION

+0

*「這是什麼有效」* - 什麼不*「工作」*(以哪種方式)? – 2013-04-24 09:20:46

+0

刪除glVertexAttribPointer或在初始化時分配它,而不是在每個並條框中放置它都不會顯示我的對象。我要出去的肢體,並說所需的東西是useProgram + glBindBuffer(GLES20.GL_ARRAY_BUFFER,+ glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER + glDrawElements。我一直在尋找,也許我正在尋找一個頂點數組對象我希望繪製框架只調用什麼準系統需要 – user1681732 2013-04-24 12:10:02

+0

我繼續研究,看起來我不應該把我的手柄傳遞給glEnableVertexAttribArray,我應該生成它們..也許。 – user1681732 2013-04-24 14:52:01

回答

0

到glEnableVertexAttribArray和glVertexAttribPointer的調用都需要每一幀,如果你沒有使用擴展名。

但是,如果擴展OES_vertex_array_object可用,那麼您可以使用頂點數組對象來存儲此信息與VBO數據。然後你只需要每幀調用glBindVertexArray和glDrawArrays。

相關問題