Note that there are some explanatory texts on larger screens.

plurals
  1. POFramebuffer FBO render to texture is very slow, using OpenGL ES 2.0 on Android, why?
    primarykey
    data
    text
    <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>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload