我正在尝试开发一种基于OpenGL的DirectShow转换过滤器,该滤镜以用户指定的任意角度旋转图像。我使用非常基本的图像旋转样本,利用glRotatef。旋转代码作为独立的窗口应用程序非常有效。但是通过直接显示过滤器调用时出错。
附加信息:
- 独立的 OpenGL 旋转应用程序在任何阶段都运行良好,没有任何错误。相同的 OpenGL 代码不能作为 Directshow 过滤器的一部分工作。
- 在 Directshow 筛选器的转换函数之前的所有 OpenGL 调用都成功,没有任何 GLErrors。
- DirectShow 筛选器的转换函数之后的所有 OpenGL 调用都会将错误作为无效操作(错误代码 1282)抛出。
- 我正在使用Visual Studio 2008,而不是使用任何OpenGL第三方库,如GLUT或其他东西。
我怀疑它看起来或多或少像一个线程问题。我有一个示例直接显示应用程序,用于初始化捕获过滤器,添加opengl旋转转换过滤器和视频渲染器。在初始化时,我将CoInitializeEx与COINIT_MULTITHREADED一起使用,也使用了COINIT_APARTMENTTHREADED。两者都没有在线程方面提供任何改进。
在解决这个问题时,会采取什么样的方法?
我已经通过在第一次调用转换函数期间创建 OpenGL 上下文来解决此问题。这使得 OpenGL 上下文与 OpenGL 绘图函数具有相同的线程。
有帮助的参考链接
GlGenTextures不断刷新0
https://www.opengl.org/wiki/Common_Mistakes#Extensions_and_OpenGL_Versions
纹理不适用于 OpenGL
感谢您纠正我发布的问题。
编辑:这种线程问题是由于线程之间共享设备上下文的问题。它可以通过使用 wglShareList API 在两个不同的线程之间共享上下文来处理。这已经解决了我发布的问题。
https://www.opengl.org/wiki/OpenGL_and_multithreading
https://www.opengl.org/wiki/Platform_specifics:_Windows
希望这对困在同一条船上的人有所帮助:-)