2010-07-21 154 views
4

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

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

+0

在尝试使用OpenGL命令之前是否使每个上下文都是当前的? – genpfault 2010-07-21 18:42:07

+0

是的。我有一个SetCurrentEngine命令,我在每次渲染之前调用该函数调用wglMakeCurrent。 – Sanctus2099 2010-07-21 21:12:05

回答

1

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

基本上,双缓冲意味着你总是渲染到屏幕外表面,然后翻转,要成为屏幕上的表面和当前屏幕上的面成为离屏表面

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

1

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/

0

OpenTK也有关于如何使用C#和OpenGL很好的例子:当有多个控制它突出的一些问题 - 无论哪种方式,下面可能是有用的。