繁体   English   中英

OpenGL闪烁问题

[英]OpenGL flickering problem

我试图用C#的包装器在C ++中制作一个多实例引擎。
在制作引擎时,要使用类似CreateEngine的函数,该函数将要在其上初始化引擎的窗口或控件的句柄作为参数。
在C#中,我制作了一个自定义控件,该控件初始化opengl进行绘制并具有render事件。
如果仅使控件的一个实例正常运行,但是当我在另一个窗口中创建另一个控件时,第二个控件将闪烁为黑色(尽管我的代码中未引用黑色,但屏幕的颜色仍为黑色)。 他们俩都没有画任何东西。 相反,它们只是清除屏幕的颜色。 第一个控件将空格清除为蓝色,第二个控件将清除为红色(理论上)。 由于没有东西可以绘制,所以我认为不必共享wgl列表或其他内容(无论如何我都做到了,但是注释部分代码将无法解决任何问题)。

还有一些人认为需要注意:我不是OpenGL n00b,但这确实使我感到困惑。 我还检查了我所知道的该领域的所有内容。 仅当有更多控件实例时,才会出现此问题。 在C#中,我重写了OnPaint事件以清除视口,并且每33毫秒使它无效。 我也重写了OnPaintBackground,因为这似乎会产生闪烁的问题。

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/

您可能想探索双重缓冲-如果您的机器有很多多余的功率,那么您可能不会注意到屏幕清晰并使用单个控件重新绘制,但是一旦渲染控件中有两个控件以及所有设置/拆卸操作开销,

基本上,双重缓冲意味着您始终要渲染到屏幕外表面,然后将其翻转为屏幕上表面,而当前屏幕上表面将变为屏幕外表面

这是一个教程(在google上搜索OpenGL双缓冲,您会发现很多) http://www.swiftless.com/tutorials/opengl/smooth_rotation.html

OpenTK还提供了有关如何使用c#和OpenGL的良好示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM