【问题标题】:Render a unique video stream in two separate opengl windows在两个单独的 opengl 窗口中渲染一个独特的视频流
【发布时间】:2011-04-21 19:08:02
【问题描述】:

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

在第一个 openGL 窗口中,有一个计时器,在该计时器上切换一个布尔值“lmutex”并调用“DrawScene”函数,然后调用“Yield”函数。

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

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

第二个 borland builder 旨在用作预览窗口,因此它可以具有较小的尺寸(mipmap?)和较慢的计时器(或相同的大小,相同的计时器,也可以)。

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

  • 使用像素缓冲区,我实现(全部在 DrawScene 函数中)将paintgl 写入后缓冲区,并使用 wglShareLists 将此后缓冲区渲染到映射到四边形的纹理;但我无法在另一个窗口中使用此纹理,wglShareLists 在第一个窗口中工作,但在第二个窗口中当我尝试与新窗口 RC 共享 back_buffer 的对象时失败(像素格式问题?)(C++ 问题也许?如何在不释放缓冲区的情况下保留缓冲区,并将其渲染到不同 DC(或相同 RC?)的四边形上:

Access violation on wglBindTexImageARB ; due to WGL_FRONT_LEFT_ARB not defined allthoug wglext.h included?

wglShareLists fails with error 6 : ERROR_INVALID_HANDLE The handle is invalid

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

  • 我尝试使用 FBO、GLew 或 wgl 函数,但我遇到了 glGenFrameBuffer 上的访问冲突;也许 Borland 6 (2002) 可能太旧而无法支持 FBO (~2004 ?);我更新了我最近的 NVIDIA 卡 (9800GT) 驱动程序并下载了 nvidia opengl SDK(这只是一个 exe 文件:奇怪):

Using Frame Buffer Objects (FBO) in Borland C++ Builder 6

是否有 C++ 程序画布或代码片段可以阐明如何在第二个窗口中显示我在一个窗口中完美显示的视频?

【问题讨论】:

  • 求助:我只需要严格复制一个 OpenGL 窗口。欢迎任何建议、提示或帮助。

标签: c++ opengl c++builder


【解决方案1】:

首先,所有的左右绘制缓冲区并不是用来渲染到两个不同的渲染上下文,而是允许在一个渲染上下文中的立体渲染通过信号发送给某些 3D 硬件(例如快门眼镜)司机。除此之外,您的图形硬件/驱动程序是否不支持该扩展 - 标识符是否在 glew 中定义。

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

那里有许多 VBO 示例,但大多数是用 C 编码的。如果您能阅读德语,您可能需要查看 DelphiGL.com;那里的人有很好的 OpenGL 知识和非常有用的 Wiki,其中包含文档、示例和教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多