【发布时间】: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?)的四边形上:
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