2012-09-19 28 views
7

Có thể hiển thị Chế độ xem (nói, một WebView) thành FBO để nó có thể được sử dụng làm kết cấu trong một thành phần OpenGL không?Có thể hiển thị Chế độ xem Android cho OpenGL FBO hoặc kết cấu không?

+0

liên tục? Hoặc như một loại hình chụp nhanh một lần thỏa thuận? – kabuko

+0

@kabuko Liên tục. – bobpoekert

+0

Theo như tôi biết, không. AFAIK tốt nhất bạn có thể làm là render View to Bitmap và gán nó cho texture bằng GLUtils. – harism

Trả lời

10

Yes là nó chắc chắn có thể, tôi đã viết lên một cách để ở đây; http://www.felixjones.co.uk/neo%20website/Android_View/

Tuy nhiên đối với các phần tử tĩnh không thay đổi, tùy chọn bitmap có thể tốt hơn.

+0

Tôi thấy không phải tất cả các chế độ xem đều có thể vẽ. TextureView không thể vẽ như thế này. Bạn có thể giải quyết nó? – dragonfly

+0

@fadden Nếu tôi sử dụng TextureView, tôi tìm thấy trênSurfaceTextureAvailable của TextureView.OnFrameAvailableListener không được gọi lại. Tại sao TextureView không thể vẽ như thế này? – dragonfly

0

Ít nhất một người quản lý để làm cho văn bản theo cách này:

Rendering Text in OpenGL on Android

Nó mô tả các phương pháp tôi đã sử dụng để biểu diễn chất lượng cao văn bản động hiệu quả sử dụng OpenGL ES 1.0, với TrueType/OpenType tệp phông chữ.

[...]

Toàn bộ quá trình thực sự là khá dễ dàng. Chúng tôi tạo bitmap (như một kết cấu), tính toán và lưu trữ kích thước của mỗi nhân vật, cũng như vị trí của nó trên kết cấu (tọa độ UV). Có một số chi tiết khác tốt hơn, nhưng chúng tôi sẽ nhận được điều đó.

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

9

Dự án trình diễn hoàn chỉnh hiển thị chế độ xem kết cấu GL theo thời gian thực theo cách hiệu quả có thể được tìm thấy trong this repo. Nó cho thấy làm thế nào để render WebView thành GL texture trong thời gian thực như là một ví dụ.

Ngoài ra một mã ngắn gọn cho điều này có thể trông giống như sau (lấy từ dự án trình diễn từ repo trên):

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; 
    } 
} 

Bản demo đầu ra ảnh chụp màn hình:

Các vấn đề liên quan