2012-12-28 78 views
3

如何創建兩個SFML窗口,然後使用OpenGL將它們繪製到兩個窗口?多個SFML OpenGL Windows

如果您想知道如何創建和使用兩個或更多的OpenGL的SFML窗口,那麼這裏就是解決方案。我無法找到有關如何在互聯網上的其他任何地方執行此操作的信息,所以在這裏。我希望這有助於某個人。

順便說一句,你可能想知道爲什麼這可能是做一個有用的東西:

它是物理學家能夠顯示系統給其他人的動畫非常有用的東西,因爲我們經常想編程一些東西的演示來幫助我們解釋它。一個微不足道的例子就是盒子裏的氣體粒子的行爲。在窗口中,由於我們奇特的物理計算,粒子將被繪製並移動,就像他們在現實世界中做的一樣,在另一個窗口中,可以繪製圖表來顯示框內的總能量或平均粒子速度(溫度)和其他這樣的事情。另一個很好的例子就是模擬太陽系。有關行星的數據可以繪製到一個窗口中,而太陽系的視圖可以繪製到另一個窗口。

回答

2

做這項工作需要幾個步驟。巧妙地設計了多個窗口,事實上你必須在繪製之前調整每個窗口的大小,或者至少這是最簡單的做事方式。只有一個窗口,您只能在創建窗口後重新調整窗口大小,並且每次調整大小或重新調整大小時都會調整大小。您可能會爭辯說,有更好的方法可以通過從矩陣堆棧中推出並彈出,在這種情況下,請評論並留下其他答案。

首先,你需要聲明兩個SFML窗口,正如你所期望:sf::Window window, window2;(也許你應該檢查自己是在程序執行的最終雙雙收呢!)

其次,實施兩個調整大小的方法。像這樣的事情會做。

/// Window 
glViewport(0, 0, window.GetWidth(), window.GetHeight()); 
// Set matrix mode back again 
glMatrixMode(GL_PROJECTION); 
// Reset matrix stack 
glLoadIdentity(); 
// Set drawing surface properties - either Perspective or Orthographic 
///gluPerspective(45.0, (double)w/(double)h, 1.0d, 100.0d); 
glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d); 
// Put matrix mode back 
glMatrixMode(GL_MODELVIEW); 

現在其他:

/// Window2, which can be different to window! 
glViewport(0, 0, window.GetWidth(), window.GetHeight()); 
// Set matrix mode back again 
glMatrixMode(GL_PROJECTION); 
// Reset matrix stack 
glLoadIdentity(); 
// Set drawing surface properties - either Perspective or Orthographic 
///gluPerspective(45.0, (double)w/(double)h, 1.0d, 100.0d); 
glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d); 
// Put matrix mode back 
glMatrixMode(GL_MODELVIEW); 

你可能想要把這些代碼兩個塊在兩個不同的功能,也許實現相機類的選擇。原因在於,在使用各種OpenGL繪圖方法繪製窗口之前,您需要調用每個窗口的調整大小函數。

現在的樂趣部分。在繪製調用您要繪製到的窗口的resize方法之前。然後,如果您需要撥打glMatrixMode(GL_MODELVIEW);(以防萬一!),glLoadIdentity();glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);。很明顯,如果你不想清除屏幕,不要調用glClear或glLoadIdentity,如果你不想重置矩陣變換堆棧...

現在,你的繪圖:glBegin()glEnd()和所有其他的東西你需要做。

最後,請致電window.Display()window2.Display(),具體取決於您正在抽取哪些東西。現在回到上面的有趣部分,並調用其他窗口的resize方法,並繼續爲第二個窗口做所有事情,就像第一個窗口一樣!

現在享受多窗口的OpenGL SFML編程。您可能想要將一大堆窗口加載到矢量或其他花哨的容器中。

由於某些原因,sf :: Windows是不可複製的,這意味着你不能將它們push_back()到像deque或vector這樣的容器中。這可能是由於一些OpenGL的具體情況,如果您試圖將所有位從一個窗口類複製到另一個窗口類,將會「出錯」。 (也許?)相反,一個sf::Window* = new sf::Window[number_of_windows]unsigned int number_of_windows = 2就足夠了,雖然它不是很好...