问题 使用openGL进行视频显示


我想用OpenGL直接显示非常高分辨率的视频。

图像数据将在GPU上进行处理,我希望避免往返PC,以在基于标准位图的窗口中显示视频。
跨平台很好,Windows只会好(只有nvidia)

任何人都有这方面的链接吗?

在Qt中有一个糟糕的NeHe教程和一些嵌入式openGL小部件的例子,但我需要更好的性能和更大的图像。


5555
2018-06-18 15:02


起源



答案:


假设使用OpenGL 2.1,请使用GL_PIXEL_UNPACK_BUFFER类型的缓冲区对象将像素数据流式传输到纹理。它比每帧上传数据更快,因为当你使用glMapBuffer,glMapBufferRange(OpenGL 3.2)或直接调用glBufferData时,实现可能会使用DMA进行复制。您还可以在每个批处理中复制多个帧,以在复制开销和映射开销之间进行权衡。最后,创建一个着色器以将YUV或YCbCr转换为RGB并使用三角形条显示纹理。


10
2018-06-20 03:17



在全屏四边形上出现三角形的原因是什么? - Martin Beckett
是的,四边形在每个方面都很糟糕,不应该被使用,只要忘记它们曾经存在过。


答案:


假设使用OpenGL 2.1,请使用GL_PIXEL_UNPACK_BUFFER类型的缓冲区对象将像素数据流式传输到纹理。它比每帧上传数据更快,因为当你使用glMapBuffer,glMapBufferRange(OpenGL 3.2)或直接调用glBufferData时,实现可能会使用DMA进行复制。您还可以在每个批处理中复制多个帧,以在复制开销和映射开销之间进行权衡。最后,创建一个着色器以将YUV或YCbCr转换为RGB并使用三角形条显示纹理。


10
2018-06-20 03:17



在全屏四边形上出现三角形的原因是什么? - Martin Beckett
是的,四边形在每个方面都很糟糕,不应该被使用,只要忘记它们曾经存在过。


与OpenGL相关的显而易见的事情是将位图显示为纹理。


2
2018-06-18 15:05



是的 - 我只是想知道是否有一些视频特定的性能技巧,而不是仅仅将每个帧复制到全屏四边形 - Martin Beckett
@Martin:通常不会 - 只要你将所有内存保持在卡本身上,几乎任何合理的视频卡都可以很容易地提供带宽,以最大刷新率重写屏幕上的每一位(特别是现在,因为液晶显示器的刷新速度几乎从不高于60赫兹 - 高端CRT的刷新速度超过100赫兹就更难了。 - Jerry Coffin
这就是问题 - 我需要在120Hz做1080p(理想情况下是其中两个!) - Martin Beckett
@Martin:无论如何,我不会对它造成任何问题。我设法用Pentium III驱动的GeForce 5800跟上~100 Hz刷新。决议是 有些 较低,但不是很大,现代卡是 好 超过两倍的速度。 - Jerry Coffin


所以你想在纹理上发送视频并用片段着色器处理它? 这里的 一个简短的教程如何做类似的事情。这只是一个简单的OpenGL 2.0示例,它创建了2个窗口大小的纹理,并在片段着色器中混合它们。没有涉及视频,但如果您已经有解码方法,则不应该很难修改。


1
2018-06-18 16:48





如果你愿意,我已经创建了一个非常简单的API,在许多方面,它还可以将视频显示为opengl纹理。您还可以使用实时视频Feed创建动态高度贴图。

您可以在以下位置查看API http://www.barbato.us/category/programming-labs/

非常易于使用,使代码非常易读。

祝你好运!!!


0
2017-11-24 02:54