2016-05-15 10 views
0

Ich bin dabei, zu versuchen, eine einfache texturierte Quad als VBO zu rendern. Wenn VBOs nicht verwendet werden, funktioniert alles wie erwartet (bei statischen Objekten aktualisiere ich jedoch immer noch meine Eckendaten, was sinnlos erscheint, daher der Wechsel zu VBOs).Android OpenGL ES 2. 0 VBO nicht Rendern

Allerdings muss ich etwas falsch machen, denn ich bekomme nichts, absolut zilch, auf den Bildschirm gerendert.

ist hier der entsprechende Code ich habe:

Konstruktor:

public VBO() { 

     updateVertexData(); 

     vertexBuf = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); 

     vertexBuf.put(vertices); 

     vertexBuf.position(0); 

     //Create buffers array for VBO (I'm using interleaved data so only 1 needed here?? 
     final int buffers[] = new int[1]; 

     GLES20.glGenBuffers(1, buffers, 0); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 

     GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GLES20.GL_STATIC_DRAW); 

     GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

     mBufferIdx = buffers[0]; 

     vertexBuf.limit(0); 
     vertexBuf = null; 
    } 

Vertex-Update

public void updateVertexData(){ 

    vertices[0]=-1; 
    vertices[1]=1f; 
    vertices[2]=0; 
    vertices[3]=0; 
    vertices[4]=0; 

    vertices[5]=1; 
    vertices[6]=1f; 
    vertices[7]=0; 
    vertices[8]=1; 
    vertices[9]=0; 

    vertices[10]=-1; 
    vertices[11]=-1f; 
    vertices[12]=0; 
    vertices[13]=0; 
    vertices[14]=1; 

    vertices[15]=1; 
    vertices[16]=-1f; 
    vertices[17]=0; 
    vertices[18]=1; 
    vertices[19]=1; 
} 

Rendering

public void drawVBO(){ 

    GLES20.glUseProgram(iProgId); 

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

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx); 

    GLES20.glEnableVertexAttribArray(iPosition); 

    GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 5 * 4, 0); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx); 

    GLES20.glEnableVertexAttribArray(iTexCoords); 

    GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3); 

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 

} 

Wie ich sagen, wenn ich die VBO-Code Streifen und den Code aus updateVertexData zurück in mein Ziehverfahren bewegen, dann arbeitet jeder OK. Würde mich freuen wenn mir jemand erklären könnte was ich hier falsch mache ....

+0

HALLO @RetoKoradi, danke für den Kommentar, ich habe versucht, es nur ohne die * 4, aber es macht keinen Unterschied, ich habe noch nichts gemacht bekommen. Wäre nicht VertexBuf jedoch ein FloatBuffer anstatt eines ByteBuffers, da ich einen 'asFloatBuffer' an das Ende angehängt habe? Vielen Dank. – Zippy

+0

Oh, ok, ich habe übersehen, dass sich die Linie über den sichtbaren Bereich hinaus erstreckte und ich horizontal scrollen musste. –

+0

Keine probs @RetoKoradi, ich denke, ich habe herausgefunden, warum es nicht funktionierte :-) – Zippy

Antwort

0

Das Problem war der Offset auf der 2. 'glVertexAttribPointer' Linie.

Ursprüngliche Linie

GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3); 

Die 'Offset' Parameter (die '3' am Ende) falsch waren. 3 ist die Größe der Positionsdaten (x, y & z) und dies muss mit 4 multipliziert werden (Bytes pro Float). So ...

richtigen Code

//For readability 
final int POSITION_SIZE = 3; 
final int BYTES_PER_FLOAT = 4; 
final int TEXTURE_SIZE = 2; 
final int STRIDE = (POSITION_SIZE+TEXTURE_SIZE)*BYTES_PER_FLOAT 

//Correct line 
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, STRIDE, (POSITION_SIZE*BYTES_PER_FLOAT));