这需要几个步骤才能实现。多窗口的复杂之处在于您必须在绘制之前调整每个窗口的大小,或者至少这是最简单的方法。对于一个窗口,您只需在创建窗口后调整大小,并且每次调整大小或改变形状时。您可能会认为通过从矩阵堆栈中推入和弹出来做这件事会更好,在这种情况下,请评论并留下其他答案。
首先,您需要声明两个SFML窗口,正如您所期望的那样:
sf::Window window, window2;
(在程序执行结束时,您应该检查它们是否都关闭!)
其次,为两个窗口实现一个调整大小的方法。像这样的东西就可以了。
glViewport(0, 0, window.GetWidth(), window.GetHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d);
glMatrixMode(GL_MODELVIEW);
现在是另一个内容:
glViewport(0, 0, window.GetWidth(), window.GetHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0d, 50.0d, -50.0d, 50.0d, -10.0d, 10.0d);
glMatrixMode(GL_MODELVIEW);
你可能需要将这两个代码块放在两个不同的函数中,并且可能需要实现你选择的相机类。原因是在使用各种OpenGL绘图方法之前,您需要为每个窗口调用调整大小函数。
现在进入有趣的部分。在绘制之前,调用要绘制到的窗口的调整大小方法。然后如果需要调用
glMatrixMode(GL_MODELVIEW);
(以防万一!),
glLoadIdentity();
和
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
。显然,如果您不想清除屏幕,则不要调用glClear或glLoadIdentity,如果您不想重置矩阵变换堆栈......
现在开始绘图:
glBegin()
和
glEnd()
和所有其他必要的操作。
最后,调用
window.Display()
或
window2.Display()
,具体取决于您刚刚绘制的窗口是哪一个。现在回到上面的有趣部分,并为另一个窗口调用调整大小方法,并像第一个窗口一样继续执行所需的所有操作!
现在享受使用多个窗口进行OpenGL SFML编程。您可能还希望将大量窗口放入向量或其他高级容器中。
[编辑]由于某些原因,sf::Windows是不可复制的,这意味着您无法将它们推入类似deque或vector的容器中。这可能是由于一些特定于OpenGL的事情,如果尝试从一个窗口类复制所有位,则会出现“错误”。因此,
sf::Window* = new sf::Window[number_of_windows]
和
unsigned int number_of_windows = 2
就足够了,虽然不太好看......