Framebuffer: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (=Die Bildentstehung im Framebuffer=)
(Hinweis auf GL_EXT_framebuffer_object)
 
(4 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Bevor das Bild, welches man rendert, auf dem Monitor sichtbar wird, wird es in den so genannten Framebuffer der OpenGL geschrieben. Im Framebuffer liegen die Grafikdaten als [[Fragment]]e vor.
+
Bevor das Bild, welches man rendert, auf dem Monitor sichtbar wird, wird es in den so genannten Framebuffer geschrieben. Im Framebuffer wird nicht nur die Farbe eines Bildpunktes gespeichert, sondern auch dessen Tiefe und/oder dessen Stencil-Wert.
 +
 
 +
Wenn ein Objekt gezeichnet wird, so muss sowohl der Tiefentest (welcher seine Daten vom [[Tiefenpuffer]] und von der Tiefe des zu prüfenden [[Fragment]]es bezieht) als auch der Stencil-Test (welcher seine Daten aus dem [[Schablonenpuffer]] und vom Stencil-Wert des zu prüfenden [[Fragment]]es bezieht) bestanden werden, damit die Daten im [[Farbpuffer]] landen. Der Tiefen- und Stencil-Test kann natürlich aktiviert oder deaktiviert werden. Voraussetzung für beide Tests ist aber natürlich das Vorhandensein der Puffer, welches durch das gewählte [[Pixelformat]] (gesetzt durch [[WGL ARB pixel format]] bzw. [[SetPixelFormat]]) gewährleistet sein muss.
 +
 
 +
Seit relativ kurzer Zeit steht die neue Extension [[GL_EXT_framebuffer_object]] zur Verfügung, mit der man schnell und komfortabel eigene Framebuffer anlegen und wieder auslesen kann, wodurch sich neue Anwendungsmöglichkeiten erschließen.
  
Der Framebuffer erhält die verschiedenen Daten der Fragmente aus unterschiedlichen Buffern.
 
Die Bilddaten des gezeichneten Objektes werden in den [[Farbpuffer|Colorbuffer]] (Farbpuffer) geschrieben. Gleichzeitig gelangen auch die Tiefenkoordinaten des Objektes an den bestimmten Bildpunkten in den so genannten [[Tiefenpuffer|Depthbuffer]] (Tiefenpuffer). Dies geschieht jedoch nur, wenn man zuvor den Tiefentest aktiviert hat. Nun gelangen die Farbwerte aus dem Colorbuffer und die Tiefenwerte aus dem Depthbuffer in den Framebuffer. Hier werden diese Daten in den entsprechenden Fragmenten abgelegt.
 
  
 
==Die Bildentstehung im Framebuffer==
 
==Die Bildentstehung im Framebuffer==
  
Wenn ein Objekt gezeichnet wird, so wird der Colorbuffer an diesen Stellen komplett überschrieben. Ebenso der Depthbuffer. Beim erneuten Schreiben in den Framebuffer wird nun überprüft, ob die Tiefenkoordinaten des neuen Objektes an den einzelnen Bildpunkten größer sind, als die Tiefenwerte der einzelnen Fragmente im Framebuffer. Dieser Vorgang wird auch als Tiefentest bezeichnet. Besteht ein Fragment den Tiefentest, dann wird das alte Objekt von dem Neuen verdeckt und es werden die Daten aus Colorbuffer und Depthbuffer in den Framebuffer geschrieben. Dieser Vorgang wiederholt sich, bis alle Objekte gezeichnet wurden. Das Bild liegt nun fertig im Framebuffer und kann auf dem Bildschirm angezeigt werden.
+
Wenn ein (das erste) Objekt gezeichnet wird, so wird der Colorbuffer an diesen Stellen beschrieben. Ebenso der [[Tiefenpuffer]]. Vor dem erneuten schreiben in den Framebuffer wird nun überprüft, ob die Tiefenkoordinaten der [[Fragment|Fragmente]] des neuen Objektes den [[Tiefentest]] bestehen (üblicherweise muss der Tiefenwert dafür kleiner - also näher - sein als der bereits existierende Wert im Framebuffer). Dieser Vorgang wiederholt sich bis alle Objekte gezeichnet wurden. Das Bild liegt nun fertig im Framebuffer und kann auf dem Bildschirm angezeigt werden.
Das Verhalten des Depthbuffer kann selbstverständlich auch geändert werden. Dies ist mit Hilfe des Befehls [[glDepthFunc]] möglich.
+
 
 +
Ähnlich wie der [[Tiefenpuffer]] können auch die Stencil-Werte mit dem [[Schablonenpuffer]] verglichen werden. Das verhalten von beiden Tests kann mittels [[glDepthFunc]] bzw. [[glStencilFunc]] verändert werden.
  
Die OpenGL bietet noch weitere Buffer (z.B. den [[Stempelpuffer|Stencilbuffer]]), welche die Bildentstehung im Framebuffer beeinflussen können.
 
 
Der Framebuffer funktioniert nach dem so genannten [[Doppelpufferung|Doublebuffering]]prinzip.
 
Der Framebuffer funktioniert nach dem so genannten [[Doppelpufferung|Doublebuffering]]prinzip.

Aktuelle Version vom 18. Oktober 2006, 16:12 Uhr

Bevor das Bild, welches man rendert, auf dem Monitor sichtbar wird, wird es in den so genannten Framebuffer geschrieben. Im Framebuffer wird nicht nur die Farbe eines Bildpunktes gespeichert, sondern auch dessen Tiefe und/oder dessen Stencil-Wert.

Wenn ein Objekt gezeichnet wird, so muss sowohl der Tiefentest (welcher seine Daten vom Tiefenpuffer und von der Tiefe des zu prüfenden Fragmentes bezieht) als auch der Stencil-Test (welcher seine Daten aus dem Schablonenpuffer und vom Stencil-Wert des zu prüfenden Fragmentes bezieht) bestanden werden, damit die Daten im Farbpuffer landen. Der Tiefen- und Stencil-Test kann natürlich aktiviert oder deaktiviert werden. Voraussetzung für beide Tests ist aber natürlich das Vorhandensein der Puffer, welches durch das gewählte Pixelformat (gesetzt durch WGL ARB pixel format bzw. SetPixelFormat) gewährleistet sein muss.

Seit relativ kurzer Zeit steht die neue Extension GL_EXT_framebuffer_object zur Verfügung, mit der man schnell und komfortabel eigene Framebuffer anlegen und wieder auslesen kann, wodurch sich neue Anwendungsmöglichkeiten erschließen.


Die Bildentstehung im Framebuffer

Wenn ein (das erste) Objekt gezeichnet wird, so wird der Colorbuffer an diesen Stellen beschrieben. Ebenso der Tiefenpuffer. Vor dem erneuten schreiben in den Framebuffer wird nun überprüft, ob die Tiefenkoordinaten der Fragmente des neuen Objektes den Tiefentest bestehen (üblicherweise muss der Tiefenwert dafür kleiner - also näher - sein als der bereits existierende Wert im Framebuffer). Dieser Vorgang wiederholt sich bis alle Objekte gezeichnet wurden. Das Bild liegt nun fertig im Framebuffer und kann auf dem Bildschirm angezeigt werden.

Ähnlich wie der Tiefenpuffer können auch die Stencil-Werte mit dem Schablonenpuffer verglichen werden. Das verhalten von beiden Tests kann mittels glDepthFunc bzw. glStencilFunc verändert werden.

Der Framebuffer funktioniert nach dem so genannten Doublebufferingprinzip.