Exemplo n.º 1
0
  @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;
  }
Exemplo n.º 2
0
  @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);
  }