title: Framebuffer FBO render to texture is very slow, using OpenGL ES 2.0 on Android, why?
body: <p>I am programming an Android 2d game using opengl es 2.0. After I draw my sprites to the backbuffer I draw lights to a FBO and try to blend it to the back buffer again.
  When I draw the FBO to the framebuffer, even trasparent without any color, the framerates drops from 60 to 30 on a Samsung Galaxy w (it has an adreno 205 as gpu). I searched everywhere and tried everything, even if I draw a single sprite on the scene and blend a trasparent FBO texture to the screen the framerate drops. I tried other games with lighting effects on that phone and they run fine, almost every game is fine on that phone, I believe they use the framebuffer as well.
  On the Galaxy SII (mali 400 gpu) runs fine, I am quite new to opengl so I believe I am making a mistake somewhere, I share my code.</p>
  
  <pre><code>// Create a framebuffer and renderbuffer
  GLES20.glGenFramebuffers(1, fb, offset);
  GLES20.glGenRenderbuffers(1, depthRb, offset);
  
  // Create a texture to hold the frame buffer
  GLES20.glGenTextures(1, renderTex, offset);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[offset]);
  
  GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
                      screenWidth, screenHeight, 0,
                      GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,
                      null);
  
  
  GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
                         GLES20.GL_CLAMP_TO_EDGE);
  GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                         GLES20.GL_CLAMP_TO_EDGE);
  GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
                         GLES20.GL_LINEAR);
  GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                         GLES20.GL_LINEAR);
  
  //bind renderbuffer
  GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[offset]);
  
  GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
                               screenWidth, screenHeight);
  
  // bind the framebuffer
  GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[offset]);
  
  // specify texture as color attachment
  GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
                                GLES20.GL_TEXTURE_2D, renderTex[offset], 0);
  
  // specify depth_renderbufer as depth attachment
  GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT,
                                   GLES20.GL_RENDERBUFFER, depthRb[0]);
  
  // Check FBO status.
  int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
  
  if ( status == GLES20.GL_FRAMEBUFFER_COMPLETE )
  {
      Log.d("GLGame framebuffer creation", "Framebuffer complete");
  }
  
  
  // set default framebuffer
  GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
  </code></pre>
  
  <p>I do this once on surface creation. Not sure if is correct. I keep the texture and framebuffer ids to switch to them when I need.
  My drawing code:</p>
  
  <pre><code>GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
  ShaderProgram program = glgame.getProgram();
  
  //put vertices in the floatbuffer
  mTriangleVertices.put(vertices, 0, len);
  mTriangleVertices.flip();
  
  GLES20.glVertexAttribPointer(program.POSITION_LOCATION, 2, GLES20.GL_FLOAT, false,
                               TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
  
  //preparing parameter for texture position
  mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
  GLES20.glEnableVertexAttribArray(program.POSITION_LOCATION);
  
  //preparing parameter for texture coords
  GLES20.glVertexAttribPointer(program.TEXTURECOORD_LOCATION, 2, GLES20.GL_FLOAT,
                               false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES,
                               mTriangleVertices);
  
  //set projection matrix
  GLES20.glEnableVertexAttribArray(program.TEXTURECOORD_LOCATION);
  GLES20.glUniformMatrix4fv(program.MATRIX_LOCATION, 1, false, matrix, 0);
  
  //draw triangle with indices to form a rectangle
  GLES20.glDrawElements(GLES20.GL_TRIANGLES, numSprites * 6, GLES20.GL_UNSIGNED_SHORT,
                        indicesbuf);
  
  //clear buffers
  mTriangleVertices.clear();
  mVertexColors.clear();
  </code></pre>
  
  <p>Everything is rendered on screen correctly, but the performance are ruined just when I draw the FBO texture.
  Thank you very much for your help. I worked very hard on this and didn't find a solution.</p>