Renderkontext: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Quickstart verlinkt)
(Ein bisschen erweitert, umgestellt und verbessert (hoffe ich ;) ))
Zeile 1: Zeile 1:
 
{{Template:Unvollständig|Hier fehlen noch einige Angaben zur Erzeugung und Verwendung. Zudem sollte noch mal jemand drüberschauen, ob die angegebenen Informationen zu den enthaltenen Info's korrekt sind.}}
 
{{Template:Unvollständig|Hier fehlen noch einige Angaben zur Erzeugung und Verwendung. Zudem sollte noch mal jemand drüberschauen, ob die angegebenen Informationen zu den enthaltenen Info's korrekt sind.}}
  
Der [[Renderkontext]] ist eine Beschreibung verschiedener Informationen, die eine Zeichenfläche und die zu dieser zugeordneten Ressourcen enthält. Diese Informationen enthalten dabei Angaben zum verwendeten [[Pixelformat]], den Abmessungen der Zeichenfläche (Höhe, Breite, Aspekt-Ratio), sowie Angaben zur Lage der Datenpuffer für Farb-, [[Stencil-Buffer|Stencil-]], [[Tiefen-Puffer|Tiefen-]] und Transparenz-Informationen. Zudem enthält der Render-Kontext allgemeine Statusinformationen wie die Art und Dicke zu zeichnender Linien, die zum Zeichnen zu verwendenden Texturen sowie andere Angaben, die für das Zeichnen notwendig sind.
+
Der [[Renderkontext]] ist eine Beschreibung verschiedener Informationen, die eine Zeichenfläche und die zu dieser zugeordneten Ressourcen enthält. Diese Informationen enthalten dabei Angaben zum verwendeten [[Pixelformat]], den Abmessungen der Zeichenfläche (Höhe, Breite, Aspekt-Ratio), sowie Angaben zur Lage der Datenpuffer für [[Farbpuffer|Farb-]], [[Stencil-Buffer|Stencil-]], [[Tiefenpuffer|Tiefen-]] und Transparenz-Informationen. Zudem enthält der Render-Kontext allgemeine Statusinformationen wie die Art und Dicke zu zeichnender Linien, die zum Zeichnen zu verwendenden Texturen sowie andere Angaben, die für das Zeichnen notwendig sind.
  
 
== Anlegen eines Renderkontext ==
 
== Anlegen eines Renderkontext ==
 +
{{Template:Hinweis|Dieser Abschnitt beschreibt das Vorgehen unter Windows. Unter Linux können Details abweichen (Wenn jemand mit Linux mehr Erfahrung hat, wäre eine Teilung und differenziertere Beschreibung erwünscht)}}
  
Damit man mit OpenGL arbeiten kann, muss man sich, wie im [[Tutorial_Quickstart|Quickstart]] beschrieben, zuerst eine Zeichenfläche anlegen. Neben der Zeichenfläche wird dabei jedoch noch eine ganze Reihe anderer Dinge vorbereitet. So wird durch das Setzen des [[Pixelformat]]s und die Anforderung eines Bereichs mit bestimmten Abmessungen zusätzlich auch eine ganze Reihe von Datenpuffern im RAM und auf der Grafikkarte reserviert. Diese sorgen dafür, dass bei der späteren Arbeit mit dieser Zeichenfläche OpenGL eine Möglichkeit hat, seine Daten zu hinterlegen, um sie bei darauffolgenden Befehlen wiederzufinden.
+
Um überhaupt mit OpenGL arbeiten zu können, muss ein Renderkontext zuerst einmal angelegt werden. Dabei muss man einen vorhandenen [[Gerätekontext]] (DC) zugrunde legen. Ein Renderkontext spannt sich dabei immer über den gesamten Gerätekontext und damit über den gesamten Clientbereich des Fensters, zu dem der Gerätekontext gehört.
 +
 
 +
Beim Anlegen werden sowohl auf der Grafikkarte als auch im RAM abhängig von den Einstellungen des Gerätekontextes ([[Pixelformat]], Höhe, Breite...) diverse Speicherbereiche reserviert, in dem später dann [[Farbpuffer|Farb-]] oder [[Tiefenpuffer]], die Informationen der Statemachine, Texturen, Displaylisten oder VBOs abgelegt werden (natürlich werden auch einige Bereiche erst später dynamisch reserviert).
  
 
== Einflussnahme auf den Renderkontext ==
 
== Einflussnahme auf den Renderkontext ==
 +
Bei jedem Aufruf einer Funktion von OpenGL, die an der Art und Weise, wie etwas gezeichnet werden soll, oder die selbst etwas zeichnet, nimmt OpenGL Veränderungen an den im Renderkontext hinterlegten Angaben vor. Diese Veränderungen spiegeln dabei die auszuführende Operation (z.B. Ändern der Linienstärke beim Zeichnen mit GL_LINES) in Form einer Status-Änderung wieder (Ändern des Wertes, der die zu verwendende Linien-Breite angibt).
 +
 +
=== Renderkontextübergreifende Daten ===
 +
OpenGL bietet (zumindest unter Windows) mittels [[wglShareLists]] die Möglichkeit, kontextspezifische Objekte wie Texturen oder Displaylisten übergreifend über zwei Renderkontexte zu verwenden. Dies ist zum Beispiel im Falle einer Editoranwendung hilfreich, die mehrere Viewports hat, die aus technischen Gründen nicht in einem Renderkontext liegen können. Für jeden Viewport alle Texturen und VBOs beziehungsweise Displaylisten zu laden, wäre natürlich viel zu großer Aufwand. Statt dessen benutzt man etwas wie wglShareLists, um die Objekte nur einmal laden zu müssen.
  
Bei jedem Aufruf einer Funktion von OpenGL, die an der Art und Weise, wie etwas gezeichnet werden soll, oder die selbst etwas zeichnet, nimmt OpenGL Veränderungen an den im Renderkontext hinterlegten Angaben vor. Diese Veränderungen spiegeln dabei die auszuführende Operation (z.B. Ändern der Linienstärke beim Zeichnen mit glLine) in Form einer Status-Änderung wieder (Ändern des Wertes, der die zu verwendende Linien-Breite angibt).
+
=== Das Thread-Problem ===
 +
Ein Problem, auf das man im Zusammenhang mit dem Laden von Daten in den Renderkontext später eventuell treffen kann ist, dass man einen Renderkontext nur so lange verändern kann, wie man sich in demjenigen Thread befindet, in dem der Kontext erstellt wurde. Das heißt, dass man Texturen oder andere OpenGL-Objekte nicht aus einem nebenläufigen Lade-Thread heraus erstellen kann. Wohl aber kann man die Daten erstmal in den RAM laden und dann an den Hauptthread weiterreichen, der sie dann an die Grafikkarte schickt.
  
Lorem ipsum ...
+
== Siehe auch ==
 +
[[Tutorial_Quickstart]]

Version vom 5. August 2008, 00:53 Uhr

Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

Hier fehlen noch einige Angaben zur Erzeugung und Verwendung. Zudem sollte noch mal jemand drüberschauen, ob die angegebenen Informationen zu den enthaltenen Info's korrekt sind.

Incomplete.jpg

Der Renderkontext ist eine Beschreibung verschiedener Informationen, die eine Zeichenfläche und die zu dieser zugeordneten Ressourcen enthält. Diese Informationen enthalten dabei Angaben zum verwendeten Pixelformat, den Abmessungen der Zeichenfläche (Höhe, Breite, Aspekt-Ratio), sowie Angaben zur Lage der Datenpuffer für Farb-, Stencil-, Tiefen- und Transparenz-Informationen. Zudem enthält der Render-Kontext allgemeine Statusinformationen wie die Art und Dicke zu zeichnender Linien, die zum Zeichnen zu verwendenden Texturen sowie andere Angaben, die für das Zeichnen notwendig sind.

Anlegen eines Renderkontext

Info DGL.png Dieser Abschnitt beschreibt das Vorgehen unter Windows. Unter Linux können Details abweichen (Wenn jemand mit Linux mehr Erfahrung hat, wäre eine Teilung und differenziertere Beschreibung erwünscht)

Um überhaupt mit OpenGL arbeiten zu können, muss ein Renderkontext zuerst einmal angelegt werden. Dabei muss man einen vorhandenen Gerätekontext (DC) zugrunde legen. Ein Renderkontext spannt sich dabei immer über den gesamten Gerätekontext und damit über den gesamten Clientbereich des Fensters, zu dem der Gerätekontext gehört.

Beim Anlegen werden sowohl auf der Grafikkarte als auch im RAM abhängig von den Einstellungen des Gerätekontextes (Pixelformat, Höhe, Breite...) diverse Speicherbereiche reserviert, in dem später dann Farb- oder Tiefenpuffer, die Informationen der Statemachine, Texturen, Displaylisten oder VBOs abgelegt werden (natürlich werden auch einige Bereiche erst später dynamisch reserviert).

Einflussnahme auf den Renderkontext

Bei jedem Aufruf einer Funktion von OpenGL, die an der Art und Weise, wie etwas gezeichnet werden soll, oder die selbst etwas zeichnet, nimmt OpenGL Veränderungen an den im Renderkontext hinterlegten Angaben vor. Diese Veränderungen spiegeln dabei die auszuführende Operation (z.B. Ändern der Linienstärke beim Zeichnen mit GL_LINES) in Form einer Status-Änderung wieder (Ändern des Wertes, der die zu verwendende Linien-Breite angibt).

Renderkontextübergreifende Daten

OpenGL bietet (zumindest unter Windows) mittels wglShareLists die Möglichkeit, kontextspezifische Objekte wie Texturen oder Displaylisten übergreifend über zwei Renderkontexte zu verwenden. Dies ist zum Beispiel im Falle einer Editoranwendung hilfreich, die mehrere Viewports hat, die aus technischen Gründen nicht in einem Renderkontext liegen können. Für jeden Viewport alle Texturen und VBOs beziehungsweise Displaylisten zu laden, wäre natürlich viel zu großer Aufwand. Statt dessen benutzt man etwas wie wglShareLists, um die Objekte nur einmal laden zu müssen.

Das Thread-Problem

Ein Problem, auf das man im Zusammenhang mit dem Laden von Daten in den Renderkontext später eventuell treffen kann ist, dass man einen Renderkontext nur so lange verändern kann, wie man sich in demjenigen Thread befindet, in dem der Kontext erstellt wurde. Das heißt, dass man Texturen oder andere OpenGL-Objekte nicht aus einem nebenläufigen Lade-Thread heraus erstellen kann. Wohl aber kann man die Daten erstmal in den RAM laden und dann an den Hauptthread weiterreichen, der sie dann an die Grafikkarte schickt.

Siehe auch

Tutorial_Quickstart