【问题标题】:OpenGL flickering problemOpenGL闪烁问题
【发布时间】:2010-08-04 07:08:14
【问题描述】:

我正在尝试用 C++ 制作一个带有 C# 包装器的多实例引擎。
在以这样的方式制作引擎时,有一个像 CreateEngine 这样的函数,它将我希望初始化引擎的窗口或控件的句柄作为参数。
在 C# 中,我创建了一个自定义控件,用于初始化 opengl 以进行绘图并具有渲染事件。
如果我只制作控件的一个实例,一切正常,但是当我创建另一个放置在另一个窗口中的实例时,第二个会闪烁为黑色(尽管我的代码中没有提到黑色,但将清晰的屏幕颜色与黑色交替显示)。他们都没有画任何东西。相反,他们只是清除屏幕的颜色。第一个控件将空间清除为蓝色,第二个控件将空间清除为红色(理论上)。 由于没有什么可画的,我认为我不必分享 wgl 列表或其他东西(我还是这样做了,但评论那部分代码不会解决任何问题)。

还有一些需要注意的地方:我不是一个 OpenGL n00b,但这真的让我很困惑。我还检查了我在这个领域所知道的一切。只有当控件的实例更多时才会出现问题。 在 C# 中,我重写了清除视口的 OnPaint 事件,并且每 33 毫秒使其无效。我还覆盖了 OnPaintBackground,因为这似乎会产生闪烁问题。

【问题讨论】:

  • 在尝试使用 OpenGL 命令之前,您是否使每个上下文都是最新的?
  • 是的。我有一个在每次渲染之前调用的 SetCurrentEngine 命令,并且该函数调用 wglMakeCurrent。

标签: c# c++ opengl


【解决方案1】:

您可能想探索双缓冲 - 如果您的机器有很多多余的马力,那么您可能不会注意到屏幕清晰并使用单个控件重绘,但只要有两个控件和所有设置/拆卸开销渲染管道

基本上,双缓冲意味着您总是渲染到屏幕外表面,然后将其翻转为屏幕表面,当前屏幕表面成为屏幕外表面

这里有一个教程(在谷歌上搜索 OpenGL 双缓冲,你会发现更多) http://www.swiftless.com/tutorials/opengl/smooth_rotation.html

【讨论】:

    【解决方案2】:

    Winforms 和 OpenGL 模型的状态和事件之间的接口可能非常棘手。我的建议是遵循其他一些成功执行此操作的代码的结构。一个不错的选择是在 Tao 框架中实现 SimpleOpenGLControl。

    http://taoframework.svn.sourceforge.net/viewvc/taoframework/trunk/src/Tao.Platform.Windows/SimpleOpenGlControl.cs?revision=158&view=markup

    另一个选择是只使用这个类而不是实现你自己的 OpenGL 控件。无论哪种方式,以下内容都可能有用 - 它突出了存在多个控件时的一些问题:

    http://slizerboy.wordpress.com/2010/04/14/multiopenglcontrol/

    【讨论】:

      【解决方案3】:

      OpenTK 也有关于如何使用 c# 和 OpenGL 的很好的例子。

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 2015-07-25
        • 2015-01-04
        • 2016-03-06
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        相关资源
        最近更新 更多