允许使用SurfaceTexture

时间:2016-02-22 19:06:10

标签: android opengl-es textures glsurfaceview

我在GLSurfaceView上使用自定义渲染器显示视频,该渲染器要求连续应用多个着色器。目前,它正在使用一个着色器成功运行,但我不知道如何扩展渲染管道以连续应用多个着色器。

我知道有一些关于应用多个着色器的示例(使用FrameBuffersRenderBuffers),但我没有找到任何处理通过SurfaceTexture传入的图像。

我想特别关注一个问题:

SurfaceTexture必须绑定到GL_TEXTURE_EXTERNAL_OES纹理。另一方面,FrameBuffer不能绑定到GL_TEXTURE_EXTERNAL_OES纹理(通常使用GL_TEXTURE_2D),因此当输入纹理为时,甚至可以使用FrameBuffer进行多次渲染。格式与输出不同?如果没有,执行多次渲染渲染的其他选项是什么?

以下是我试图扩展以执行多次传递的渲染器的onSurfaceCreated函数中的一些相关代码::

            GLES20.glGenTextures(1, this.textureID, 0);
            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, this.textureID[0]);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
            GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
            this.surfaceTexture = new SurfaceTexture(this.textureID[0]);

以下是该渲染器的onDrawFrame函数中的一些相关代码:

        synchronized (this) {
            if (this.updateSurface) {
                this.surfaceTexture.updateTexImage();
                this.surfaceTexture.getTransformMatrix(this.stMatrix);
                this.updateSurface = false;
            }
        }

        GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, this.textureID[0]);
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
        GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

  //apply shader here and call glDrawArrays() at end

0 个答案:

没有答案