我正在编写一个小工具,它在游戏的顶部绘制OpenGL叠加层,这是封闭源代码。游戏正在使用SDL,所以我只是挂钩SDL_GL_SwapWindow
并做自己的事情。然而,这种挂钩会在游戏本身产生一些副作用。我找到了一个解决方案,它基本上围绕着我自己的调用,不推荐使用glPushAttrib/glPopAttrib
。但这只解决了一半的问题。我仍然在游戏中获得随机纹理闪烁(我的意思是游戏纹理,我的表现很好)。这可能是闪烁的原因是什么?我自己的纹理可以干扰游戏纹理吗?我是否需要隔离自己的电话,我该怎么做?
答案 0 :(得分:1)
这种闪烁的原因是什么?
如果游戏使用着色器,则glPushAttrib / glPopAttrib将不会处理您可能正在使用的所有状态。不推荐使用属性堆栈,程序可能会使用未覆盖的状态,或者重用或扩展兼容性配置文件中的某些属性位以覆盖其他状态。我建议根本不使用属性堆栈,因为很难做对。
我自己的纹理会干扰游戏纹理吗?
是。假设您在纹理单元中激活了2D纹理,该纹理单元稍后用于1D纹理。如果主机程序不使用着色器,则GL_TEXTURE_2D将优先于GL_TEXTURE_1D。这是OpenGL的一个(恕我直言)设计选择,你可以让多个纹理目标同时绑定到同一纹理单元,而用于交付纹素的纹理目标取决于各个目标的优先级。
我是否需要隔离自己的电话
是
我该怎么办?
两种可能的解决方案:
为您自己的东西创建单独的OpenGL上下文。使用{wgl,glX}GetCurrentContext
和{wglGetCurrentDC,glXGetCurrentDrawable}
检索OpenGL上下文,并在您“跳入”的那一刻激活drawable。如果您还没有上下文,可以使用刚刚检索到的drawable来创建匹配的OpenGL上下文。可选择安装命名空间共享。切换到您的上下文,绘制您的东西并切换回主机程序。 - 主要缺点:切换OpenGL上下文非常昂贵。
在切换状态之前,请先使用glGet…
检索处于活动状态的状态,然后在返回主程序之前恢复旧状态。