我的应用程序(QT/OpenGL)需要以 25fps 的速度从 IP camaras 上传一堆视频,然后处理它应用:
- 对于每个视频,一个去马赛克滤镜、锐化滤镜、LUT 和失真文档。
- 然后我需要在opengl(纹理投影等)中进行渲染,选择之前处理的一个或多个帧
- 然后我需要将结果显示给一些小部件(QGLWidget)并读取像素以写入电影文件。
我试图了解 PBO 和 FBO 的优缺点,并描绘了以下架构,我想在您的帮助下进行验证:
- 我为每个视频创建一个线程,以在缓冲区(图像数组)中捕获。有一个视频缓冲区。
- 我创建了一个 Upload-filter-render 线程,其目的是:a)将帧上传到 GPU,b)将过滤器应用到 GPU,c)应用合成并渲染到纹理
- 我让 GUI 线程在我的小部件中呈现上一步中创建的纹理。
对于Upload-Frames-to-GPU过程,我想最好的方法是对每个视频使用 PBO(可能是两个 PBOS)来异步加载帧。
对于Apply-Filter-info-GPU,我想使用 FBO,这似乎是渲染到纹理的最佳选择。我会先绑定PBO上传的纹理,然后渲染到另一个纹理,过滤后的图像。我不确定只使用一个 FBO 并根据视频上传更改绑定纹理输入和绑定纹理目标,或者使用与要上传的视频一样多的 FBOS。
最后,为了将结果显示到小部件中,我使用了 FBO 渲染的最终纹理。为了写入电影文件,我使用 PBO 将像素从 GPU 异步复制回 CPU。
看起来正确吗?