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