Frame Buffer Object
帧缓冲对象:FBO。默认情况下,我们在GLSurfaceView
中绘制的结果是显示到屏幕上,然而实际中有很多情况并不需要渲染到屏幕上,这个时候使用FBO就可以很方便的实现这类需求。FBO可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。
前面我们创建了一个ScreenFilter
类用来封装将摄像头数据显示当屏幕上,然而我们需要在显示之前增加各种"效果",如果我们只存在一个ScreenFilter
,那么所有的"效果"都会积压在这个类中,同时也需要大量的if else
来判断是否开启效果。
![](https://img.haomeiwen.com/i19978008/8f503fbc001fbd0a.png)
我们可以将每种效果写到单独的一个Filter
中去,并且在ScreenFilter
之前的所有Filter
都不需要显示到屏幕中,所以在ScreenFilter
之前都将其使用FBO进行缓存。
需要注意的是: 摄像头画面经过FBO的缓存时候,我们再从FBO绘制到屏幕,这时候就不需要再使用
samplerExternalOES
与变换矩阵了。这意味着ScreenFilter
,使用的采样器就是正常的sampler2D
,也不需要#extension GL_OES_EGL_image_external : require
。然而在最原始的状态下是没有开启任何效果的,所以ScreenFilter就比较尴尬。
1、开启效果: 使用
sampler2D
2、未开启效果: 使用
samplerExternalOES
那么就需要在
ScreenFilter
中使用if else
来进行判断,但这个判断稍显麻烦,所以这里我选择使用:结构2.png
从摄像头使用的纹理首先绘制到
CameraFilter
的FBO中,这样无论是否开启效果ScreenFilter
都是以sampler2D
来进行采样。
网友评论