我在GLSurfaceView
上使用自定义渲染器显示视频,该渲染器要求连续应用多个着色器。目前,它正在使用一个着色器成功运行,但我不知道如何扩展渲染管道以连续应用多个着色器。
我知道有一些关于应用多个着色器的示例(使用FrameBuffers
和RenderBuffers
),但我没有找到任何处理通过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