TextureView和OpenGL

时间:2019-03-03 21:01:56

标签: android opengl-es textureview

当前,我正在尝试使用TextureView和OpenGL,并且我的目标是从SurfaceTexture读取缓冲区。经过大量搜索,我发现了grafika,但找不到适合的示例使用TextureView。(并且由于某种原因,我不得不使用TextureView)

我尝试的是创建一个纹理并尝试设置textureView以使用它:

    @Override
protected void onCreate(final Bundle savedInstanceState) {

    super.onCreate(null);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.activity_textureview);

    displayTextureView=(TextureView) findViewById(R.id.camera_textureview);
    mEglCore = new EglCore(null, EglCore.FLAG_RECORDABLE);
    mOffscreenSurface=new OffscreenSurface(mEglCore,VIDEO_WIDTH,VIDEO_HEIGHT);
    mOffscreenSurface.makeCurrent();
    mFullFrameBlit = new FullFrameRect(
            new Texture2dProgram(Texture2dProgram.ProgramType.TEXTURE_EXT));
    mTextureId = mFullFrameBlit.createTextureObject();
    mCameraTexture = new SurfaceTexture(false);
    mCameraTexture.attachToGLContext(mTextureId);
    displayTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
    displayTextureView.setSurfaceTexture(mCameraTexture);
    mHandler = new MainHandler(this);
    Initialized=true;
}

但随后它使我感到错误:

  

GLConsumer已附加到上下文

我也发现了this,但是在尝试了此处描述的方法后,我从glReadPixels获得的内容完全是黑色的,因此我猜必须将surfaceTexture附加到GLcontext上才能读取像素。

有人可以给我一些帮助吗?

1 个答案:

答案 0 :(得分:1)

您应该参考此 https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/ContinuousCaptureActivity.java

此示例使用surfaceView,您只需要替换为textureView。

386行:“ mDisplaySurface =新的WindowSurface(mEglCore,holder.getSurface(),false);” 只需使用textureView中的surfacetexture替换holder.getSurface()。

有一种读取缓冲区的方法 https://github.com/google/grafika/blob/master/app/src/main/java/com/android/grafika/gles/EglSurfaceBase.java

看看saveFrame方法。