2009-05-18 6 views
2

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. Gut. Jedoch im Rahmen eines anderen Programms, wo ich reagieren Ereignisse Draw (unter Windows), mit einem Gerätekontext zu mir vorbei - und wo ich vielleicht nicht GLUT zur Verfügung haben - meine Verwirrung ist dies:Wie funktionieren OpenGL-Kontexte und Gerätekontexte?

  1. Wann wird ein Gerätekontext erstellt und zerstört? Kann ich mich auf einen mir vorliegenden Gerätekontext beziehen oder nur auf einen Teil davon (und woher weiß ich das)?

  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, da eine Situation, wo ich „Zeichnen“ Ereignisse bin gesandt, wie oft ich versuchen, OpenGL Kontexte zu erstellen und wie sich dies auf die Schaffung/Zerstörung Zyklus von Gerätekontexten zusammen?

Antwort

7

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

Ein Gerätekontext wird (normalerweise) einem Fenster-Handle (HWND) zugeordnet. Es ist eigentlich ein DC (HDC ist das Handle), aber normalerweise assoziierst du einen HDC mit einem einzelnen HWND. In Windows erstellen Sie ein Fenster, das basierend auf dem Fenster auf dem Bildschirm verwendet wird, in dem gerendert werden soll.

In der Regel wird dieser Gerätekontext für die gesamte Laufzeit Ihrer Anwendung wiederverwendet. Wenn Sie in ein anderes Fenster rendern möchten, müssen Sie einen Gerätekontext (HDC) für das neue Fensterhandle generieren. Auch das Offscreen-Rendering ist etwas anders, da Sie dafür auch einen kompatiblen Gerätekontext erstellen würden.

Was Ihre Fragen:

1) Wenn Sie das Fenster erstellen, in dem Sie die Wiedergabe tun möchten, müssen Sie einen Gerätekontext, greifen und es für die Lebensdauer des Fensters verwenden.

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

+0

Großartig - ich denke, das beantwortet meine Frage. Dann wird der OpenGL-Kontext ziemlich gut mit dem DC in Verbindung gebracht, oder? Ich erinnere mich, dass ich gelesen habe, dass es nur einen Kontext pro Thread gibt. Ich nehme an, dass verschiedene Threads dann auch andere DCs haben werden? –

+0

Das Threading-Problem ist anders - wenn Sie einen Domänencontroller erstellen, müssen Sie diesen Thread immer für alle Anrufe in diesem Domänencontroller verwenden. Im Allgemeinen bedeutet dies einen Grafik/Rendering-Thread pro Gerätekontext (dh pro Fenster). –

Verwandte Themen