OpenGL闪烁问题

时间:2010-07-21 15:50:41

标签: c# c++ opengl

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

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

3 个答案:

答案 0 :(得分:1)

状态和事件的Winforms和OpenGL模型之间的接口可能非常棘手。我的建议是遵循其他一些成功完成此操作的代码的结构。一个很好的选择是在Tao Framework中实现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/

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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