2012-09-19 13 views
7

È possibile eseguire il rendering di una vista (ad esempio una visualizzazione Web) su un FBO in modo che possa essere utilizzato come trama in una composizione OpenGL?È possibile eseguire il rendering di una vista Android su un FBO o texture OpenGL?

+0

continuamente? O come una sorta di affare istantaneo di una sola volta? – kabuko

+0

@kabuko continuamente. – bobpoekert

+0

Per quanto ne so, no. AFAIK meglio che puoi fare è rendere View to Bitmap e assegnarlo a texture usando GLUtils. – harism

risposta

10

Sì è certamente possibile, ho redatto un how-to qui; http://www.felixjones.co.uk/neo%20website/Android_View/

Tuttavia, per gli elementi statici che non cambieranno, l'opzione bitmap potrebbe essere migliore.

+0

Ho trovato che non tutte le viste possono essere disegnate. TextureView non può essere disegnato in questo modo. Potresti risolverlo? – dragonfly

+0

@fadden Se utilizzo TextureView, ho trovato onSurfaceTextureAvailable di TextureView.OnFrameAvailableListener non richiamato. Perché TextureView non può essere disegnato in questo modo? – dragonfly

0

Almeno qualcuno è riuscito a rendere il testo in questo modo:

Rendering Text in OpenGL on Android

Esso descrive il metodo che ho usato per il rendering di testo dinamico di alta qualità efficiente utilizzando OpenGL ES 1.0, con TrueType/OpenType file di carattere.

[...]

L'intero processo è in realtà abbastanza semplice. Generiamo la bitmap (come una trama), calcoliamo e memorizziamo le dimensioni di ciascun carattere, nonché la sua posizione sulla trama (coordinate UV). Ci sono altri dettagli più fini, ma ci arriveremo.

OpenGL ES 2.0 Versione: https://github.com/d3kod/Texample2

9

Il progetto di dimostrazione completo che consente di visualizzare in tempo reale le trame GL in modo efficiente è disponibile in this repo. Mostra come eseguire il rendering di WebView su GL in tempo reale come esempio.

anche una breve codice per questo può apparire come il seguente (preso dal progetto demo dal repo sopra):

public class GLWebView extends WebView { 

    private ViewToGLRenderer mViewToGLRenderer; 
    ... 
    // drawing magic 
    @Override 
    public void draw(Canvas canvas) { 
     //returns canvas attached to gl texture to draw on 
     Canvas glAttachedCanvas = mViewToGLRenderer.onDrawViewBegin(); 
     if(glAttachedCanvas != null) { 
      //translate canvas to reflect view scrolling 
      float xScale = glAttachedCanvas.getWidth()/(float)canvas.getWidth(); 
      glAttachedCanvas.scale(xScale, xScale); 
      glAttachedCanvas.translate(-getScrollX(), -getScrollY()); 
      //draw the view to provided canvas 
      super.draw(glAttachedCanvas); 
     } 
     // notify the canvas is updated 
     mViewToGLRenderer.onDrawViewEnd(); 
    } 

    ... 
} 


public class ViewToGLRenderer implements GLSurfaceView.Renderer{ 

    private SurfaceTexture mSurfaceTexture; 
    private Surface mSurface; 

    private int mGlSurfaceTexture; 
    private Canvas mSurfaceCanvas; 

    ... 

    @Override 
    public void onDrawFrame(GL10 gl){ 
     synchronized (this){ 
      // update texture 
      mSurfaceTexture.updateTexImage(); 
     } 
    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height){ 
     releaseSurface(); 
     mGlSurfaceTexture = createTexture(); 
     if (mGlSurfaceTexture > 0){ 
      //attach the texture to a surface. 
      //It's a clue class for rendering an android view to gl level 
      mSurfaceTexture = new SurfaceTexture(mGlSurfaceTexture); 
      mSurfaceTexture.setDefaultBufferSize(mTextureWidth, mTextureHeight); 
      mSurface = new Surface(mSurfaceTexture); 
     } 

    } 

    public Canvas onDrawViewBegin(){ 
     mSurfaceCanvas = null; 
     if (mSurface != null) { 
      try { 
       mSurfaceCanvas = mSurface.lockCanvas(null); 
      }catch (Exception e){ 
       Log.e(TAG, "error while rendering view to gl: " + e); 
      } 
     } 
     return mSurfaceCanvas; 
    } 

    public void onDrawViewEnd(){ 
     if(mSurfaceCanvas != null) { 
      mSurface.unlockCanvasAndPost(mSurfaceCanvas); 
     } 
     mSurfaceCanvas = null; 
    } 
} 

La demo uscita screenshot:

Problemi correlati