2 Stimmen

Wie funktionieren OpenGL-Kontexte und Gerätekontexte?

Ich bin neu in der U/I-Programmierung, und ich versuche, mit OpenGL zu beginnen. Wenn ich ein Beispielprogramm ausführe, das ein neues OpenGL-Fenster mit GLUT erstellt, funktioniert es gut. Das ist gut. Im Kontext eines anderen Programms, in dem ich auf Draw-Ereignisse (unter Windows) reagieren muss, mit einem Gerätekontext, der mir übergeben wird - und in dem ich möglicherweise kein GLUT zur Verfügung habe - bin ich jedoch verwirrt:

  1. Wann wird ein Gerätekontext erstellt und zerstört? Kann ich in alle Gerätekontexte zeichnen, die mir zur Verfügung gestellt werden, oder nur in einige von ihnen (und wie kann ich das wissen)?

  2. Muss ich meinen eigenen OpenGL-Kontext erstellen und diesen zum Zeichnen verwenden, oder kann ich einen "aktuellen" OpenGL-Kontext verwenden? Muss ich den Kontext jedes Mal neu erstellen, wenn ein Zeichenereignis gesendet wird?

Im Grunde ist meine Frage, gegeben eine Situation, wo ich "Draw" Ereignisse gesendet werden, wie oft versuche ich, OpenGL-Kontexte zu erstellen und wie bezieht sich dies auf die Erstellung/Zerstörung-Zyklus von Gerätekontexten?

7voto

Reed Copsey Punkte 536986

Im Allgemeinen ist es sicher, einen einzelnen OpenGL-Kontext als ein Fenster zu betrachten, besonders unter Windows.

Ein Gerätekontext wird (normalerweise) einem Fenster-Handle (HWND) zugeordnet. Es handelt sich eigentlich um einen DC (HDC ist der Handle), aber normalerweise ordnet man einen HDC einem einzigen HWND zu. In Windows erstellen Sie ein Fenster, das auf der Grundlage des Fensters auf dem Bildschirm, in dem Sie rendern möchten, verwendet wird.

In der Regel werden Sie diesen Gerätekontext für die gesamte Laufzeit Ihrer Anwendung wiederverwenden. Wenn Sie in ein anderes Fenster rendern wollen, müssen Sie einen Gerätekontext (HDC) für das neue Fensterhandle erzeugen. Auch das Rendering außerhalb des Bildschirms ist ein wenig anders, da Sie auch dafür einen kompatiblen Gerätekontext erstellen müssen.

Was Ihre Fragen betrifft:

1) Wenn Sie das Fenster erstellen, in dem Sie das Rendering durchführen möchten, greifen Sie auf einen Gerätekontext zu und verwenden ihn für die gesamte Lebensdauer dieses Fensters.

2) Sie sollten immer den Gerätekontext verwenden, der für das Fenster, in dem Sie rendern, erstellt wurde.

0 Stimmen

Großartig - ich denke, das beantwortet meine Frage. Dann wird der OpenGL-Kontext ziemlich genau 1-1 mit dem DC verbunden sein, richtig? Ich erinnere mich, gelesen zu haben, dass es auch nur einen Kontext pro Thread gibt. Ich nehme an, dann, dass verschiedene Threads unterschiedliche DC's dann auch haben wird?

0 Stimmen

Die Frage des Threadings ist eine andere - wenn Sie einen DC erstellen, müssen Sie diesen Thread immer für alle Aufrufe in diesen DC verwenden. Im Allgemeinen bedeutet dies einen Grafik-/Rendering-Thread pro Gerätekontext (d. h. pro Fenster).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X