在两个单独的opengl窗口中渲染一个独特的视频流

Render a unique video stream in two separate opengl windows

本文关键字:一个 的视频 窗口 两个 单独 opengl      更新时间:2023-10-16

我在一个opengl窗口中渲染了这个视频流(由主窗口调用(UnitMainForm.cpp:我使用Borland Builder c++ 6.0))。

在第一个openGL窗口中,有一个定时器,在这个定时器上一个布尔"lmutex"被切换,一个"DrawScene"函数被调用,然后是一个"Yield"函数。

在这个"DrawScene"函数中,视频流帧是由一个名为"paintgl"的函数绘制的。

我如何在另一个borland生成器窗口中渲染此视频流,最好使用像素缓冲区?

第二个borland构建器旨在成为一个预览窗口,因此它可以具有较小的大小(mipmap?)并具有较慢的计时器(或相同大小,相同计时器,也可以)。

以下是我使用不同技术得到的结果:

  • 与像素缓冲区,我实现了(全部在DrawScene函数中)在backbuffer上编写paintgl,并使用wglShareLists将此backbuffer渲染为映射到quad的纹理;但我无法在另一个窗口中使用这种纹理,wglShareLists在第一个窗口中工作,但在第二个窗口中失败时,我试图与新窗口RC共享back_buffer的对象(像素格式问题?)(c++问题也许?)如何保持缓冲区而不被释放,并在不同的DC(或相同的RC ?)上渲染它:

wglBindTexImageARB的访问冲突;由于WGL_FRONT_LEFT_ARB没有定义,虽然wglext.h包括?

wglShareLists失败,错误6:ERROR_INVALID_HANDLE句柄无效

  • 调用同一个类的两个对象(opengl窗口):我看到一次三次正确渲染两个视频流;但有一次或三次,一个或两个窗口都有恒定的闪烁,有一次或三次,一个或另一个窗口一直是空白或黑色;也许我应该同步定时器或有一种方法没有闪烁?但是这个解决方案对我来说似乎是粗略的:视频流有时在两个窗口中的一个上变慢,我认为两次调用捕获视频流很重。

  • 我试图使用FBO,与GLew,或与wgl函数,但我卡住了对glGenFrameBuffer访问违规;也许Borland 6(2002)太老了,无法支持FBO (~2004 ?)我更新了我最近的NVIDIA卡(9800GT)驱动程序,并下载了NVIDIA opengl SDK(这只是一个exe文件:strange):

在Borland c++ Builder 6中使用帧缓冲对象(FBO)

是否有一个c++程序画布,或代码片段,这将澄清我如何在第二个窗口中显示我完美地显示在一个窗口中的视频?

首先,所有的左右绘制缓冲区并不意味着用于渲染到两个不同的渲染上下文,而是允许在一个渲染上下文中进行立体渲染,由驱动程序向一些3D硬件(例如快门眼镜)发出信号。除此之外,您的图形硬件/驱动程序是否支持该扩展-标识符是否以glow定义。

你要做的是将视频帧渲染到VBO,并与两个渲染上下文共享该VBO。基本上,VBO只是一个纹理,你可以使用它作为渲染目标(渲染缓冲区)或渲染源(纹理)。

有许多VBO示例,但大多数是用C编写的。如果你能读懂德语,你可以去DelphiGL.com看看;那里的人有非常好的OpenGL知识和相当有用的Wiki文档,示例和教程。