2013-04-24 95 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。

相关问题