@Override public void onDrawFrame(GL10 glUnused) { // PREPARE mTexturedRectangle.reset(); // FETCH AND TRANSFER FRAME TO TEXTURE if (mRenderRequest == RenderRequest.ALL || mExternalSurfaceTexture.isTextureUpdateAvailable()) { mExternalSurfaceTexture.updateTexture(); mFramebufferIn.bind(); mReadExternalTextureShaderProgram.use(); mReadExternalTextureShaderProgram.setTexture(mExternalSurfaceTexture); mTexturedRectangle.draw(mReadExternalTextureShaderProgram); mRenderRequest = RenderRequest.EFFECT; } // MANIPULATE TEXTURE WITH SHADER(S) if (mRenderRequest == RenderRequest.EFFECT) { if (mEffect != null) { mEffect.apply(mFramebufferIn.getTexture(), mFramebufferOut); } else { mFramebufferOut.bind(); mDefaultShaderProgram.use(); mDefaultShaderProgram.setTexture(mFramebufferIn.getTexture()); mTexturedRectangle.draw(mDefaultShaderProgram); } mRenderRequest = RenderRequest.GEOMETRY; } // RENDER TEXTURE TO SCREEN if (mRenderRequest == RenderRequest.GEOMETRY) { GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); // framebuffer 0 is the screen GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); mTextureToScreenShaderProgram.use(); mTextureToScreenShaderProgram.setTexture(mFramebufferOut.getTexture()); mTexturedRectangle.translate(0.0f, 0.0f, -1.0f); mTexturedRectangle.calculateMVP(mViewMatrix, mProjectionMatrix); mTexturedRectangle.draw(mTextureToScreenShaderProgram); } // STUFF // mFrameRateCalculator.frame(); mRenderRequest = RenderRequest.DEFAULT; }
@Override public void onSurfaceChanged(GL10 glUnused, int width, int height) { Log.d(TAG, "onSurfaceChanged " + width + "x" + height); mFramebufferIn = new Framebuffer(width, height); mFramebufferOut = new Framebuffer(width, height); mFramebufferOut.getTexture().setFilterMode(-1, GLES20.GL_LINEAR); for (Effect effect : mEffects) { /* After a surface change, if the resolution has changed, effects need to be * reinitialized to update them to the new resolution. */ if (effect.isInitialized()) { Log.d(TAG, "reinitializing effect " + effect.getName()); effect.init(width, height); } } // adjust the viewport to the surface size GLES20.glViewport(0, 0, width, height); mWidth = width; mHeight = height; setZoomLevel(1.0f); // fully re-render current scene to adjust to the change mRenderRequest = RenderRequest.ALL; onDrawFrame(glUnused); }