2010-07-21 494 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很好的例子:當有多個控制它突出的一些問題 - 無論哪種方式,下面可能是有用的。