Wenn Sie GLUT verwenden, können Sie mit den glutSetWindow () / glutGetWindow () -Aufrufen das richtige Fenster auswählen (nachdem Sie sie mit glutCreateSubWindow () erstellt haben). Manchmal ist GLUT jedoch nicht das richtige Werkzeug für den Job.
Wenn Sie unter Windows arbeiten, sollten Sie in die wglMakeCurrent () und wglCreateContext () schauen. Auf OS X gibt es aglSetCurrentContext () und so weiter, und X11 erfordert glXMakeCurrent ().
Diese Funktionen aktivieren den aktuellen OpenGL-Kontext, in den Sie rendern können. Jede plattformspezifische Bibliothek hat ihre eigenen Möglichkeiten, ein Fenster zu erstellen und einen OpenGL-Kontext daran zu binden.
Unter Windows, nachdem Sie HWND und HDC für ein Fenster erworben haben (nach einem CreateWindow- und GetDC-Aufruf). Im Allgemeinen machen Sie so etwas, um OpenGL einzurichten:
%Vor%Sie verwenden diesen Code, um mehrere Fenster zu erstellen und OpenGL an sie zu binden. Jedes Mal, wenn Sie in ein bestimmtes Fenster zeichnen wollen, müssen Sie wglMakeCurrent aufrufen, bevor Sie etwas tun und die Parameter übergeben entsprechend diesem Fenster.
Als Nebenbemerkung erlaubt OpenGL Ihnen, bestimmte Daten zwischen verschiedenen Kontexten freizugeben, aber laut Spezifikation sind die Daten, die Sie freigeben können, ziemlich begrenzt. In den meisten Betriebssystemen können Sie jedoch mehr Daten freigeben als in der Spezifikation angegeben.
Ja, das ist möglich. Für jedes Fenster müssen Sie einen eindeutigen Gerätekontext und einen Renderkontext erstellen.
%Vor%Bevor Sie GL-Aufrufe an das Fenster senden, müssen Sie wglMakeCurrent wie folgt aufrufen:
%Vor%Unter Windows können Sie OpenGL-Objekte wie Texturen und Shader mit wglShareLists () teilen. . Es teilt normalerweise alles, was Sie interessieren, trotz was MSDN sagt.
Ich habe schon mehrere OpenGL-Fenster in einer MFC-Anwendung gemacht. Hier ist eine Klasse, die Sie vielleicht nützlich finden: Da es im UI-Thread immer nur einen aktuellen Renderkontext geben kann, habe ich einen Klassenwrapper geschrieben, um die Verwaltung zu vereinfachen.
SpeichernRestoreRC.h
// this class helps to manage multiple RCs using an RAII design pattern
SaveRestoreRC.cpp:
Leiten Sie nun eine Klasse von CWnd ab und fügen Sie diese Membervariablen hinzu:
Verwenden Sie in jeder Memberfunktion, in der Sie ANY OpenGL-Befehle aufrufen, CSaveRestoreRC, damit Ihr aktueller Renderkontext nicht durcheinander gerät.
Wenn Sie nur die Bibliothek mit dem Überschwang verwenden möchten, schauen Sie sich bitte einen Code an Eric Stringer .
%Vor%Ich habe den Beispielcode unter Windows 7 ausgeführt, aber ich musste eine Zeile von glutIntit zu
ersetzen %Vor%Tags und Links opengl multi-window