opengl - 如何使用 GPU 高效地渲染和处理视频流?

标签 opengl gpu shader

我计划使用 C++、Qt 和 OpenGL 开发一个实时视频处理工具。视频叠加不是一个选项,因为着色器应该用于帧处理。目前,我设想了以下一系列步骤:

  1. 解码视频(CPU)
  2. 对其进行预处理(可选,CPU)
  3. 将其传输到显存(使用 DMA 的 GPU)
  4. 使用顶点和片段着色器 (GPU) 进一步处理它
  5. 渲染它(GPU)

我正在寻找一些一般性建议,解释可以在此处使用哪些扩展或技术。有充分的理由改用 Direct3D 吗?

最佳答案

首先,在 PC 上没有使用 DMA 的明确方法。驱动程序可能使用它,或者可能使用其他东西。

无论如何,第 3 步将是“更改显卡上的纹理数据”。在 OpenGL 中,这是 PBO(像素缓冲区对象)扩展或旧的 glTexSubImage* 函数。在 D3D9 中,它是纹理上的 LockRect 或其他方式(例如,在划痕纹理上使用 LockRect,然后 blit 到 GPU 纹理中)。其中任何一个都可能使用 DMA,但您不能确定。

然后数据在纹理中。您可以使用一些着色器将其渲染到屏幕上(例如进行 YCbCr 转换),或渲染到其他纹理中以执行更复杂的处理效果(例如模糊/发光/...)。

从某种意义上说,使用 Direct3D 更容易,因为有明确定义的“浪费方式”来做事。在 OpenGL 中,有更多的选项可以做任何事情,您必须以某种方式找出哪些是快速的(有时快速路径在不同的平台或硬件上是不同的)。

关于opengl - 如何使用 GPU 高效地渲染和处理视频流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/480460/

相关文章:

linux - ARB组件如何组装

tensorflow - 在 tensorflow v.1.15 sess=tf.Session() - 无法加载动态库 'cudnn64_7.dll' ; dlerror : cudnn64_7. 找不到 dll

c++ - 制服和变量的 OpenGL 和 GLSL 内存对齐

c++ - 使用 VBO 时的 EXC_BAD_ACCESS

linux - OpenGL - 渲染时间抖动使动画不稳定

c++ - 使用 IBO/EBO 时,程序仅在创建 VAO 后调用 glBindBuffer 绑定(bind) IBO/EBO 时才有效

c++ - 我该如何解决CUDA编程中的 fatal error C1070:文件中的#if/#endif对不匹配?

python - pyopenCL,openCL,无法在GPU上构建程序

opengl - 使用着色器将纹素移动到其中心

c++ - 片段着色器不会像 OpenGL GLSL 中的光那样创建渐变