Akkumulationspuffer
Der Akkumulationspuffer (englisch accumulation buffer) ist in der Computergrafik ein Speicherbereich für Bilder, die dort nacheinander addiert werden und von denen anschließend der Durchschnitt gebildet wird. Dadurch lassen sich bestimmte Grafikeffekte erreichen. Der Akkumulationspuffer wird entweder in Software implementiert oder von der Grafikhardware zusätzlich zum Framebuffer zur Verfügung gestellt.
Anwendungen
Mit dem Akkumulationspuffer lassen sich unter anderem folgende Effekte erreichen, indem der Durchschnitt mehrerer Bilder mit unterschiedlichen Einstellungen berechnet wird:
- Tiefenunschärfe durch Änderung des Fokus der virtuellen Kamera;
- Antialiasing durch leichtes Verschieben der Kamera;
- Bewegungsunschärfe durch unterschiedliche Zeitpunkte und damit Positionen der Objekte;
- weiche Schatten durch unterschiedliche Interpretation der Position der Lichtquelle.
Beispiel: Antialiasing
Die Idee hinter Antialiasing mittels Akkumulationspuffer ist, den Treppeneffekt durch eine höhere Abtastrate zu verhindern. Es handelt sich also um eine softwaregestützte Variante des Supersamplings. Im Einzelnen sind hierzu die folgenden Schritte erforderlich:
- Der Akkumulationspuffer wird auf eine schwarze Fläche zurückgesetzt.
- Um eine -fache Auflösung zu simulieren, werden Bilder benötigt, die sich minimal, das heißt um den Bruchteil eines Pixels unterscheiden. Minimal unterschiedliche Bilder werden erzeugt, indem die Kamera leicht verschoben wird. Nachdem jeweils eines der Bilder berechnet (gerendert) wurde, addiert man dessen Farbwerte zu denen im Akkumulationspuffer.
- Sobald man alle Bilder addiert hat, dividiert man alle Pixelwerte im Akkumulationspuffer durch . Danach steht im Akkumulationspuffer ein Bild, das den Mittelwert aus den verschobenen Einzelbildern darstellt.
- Der Inhalt des Akkumulationspuffers wird schließlich in den ursprünglichen Speicherbereich kopiert und angezeigt.
Geschichte
Der Akkumulationspuffer wurde Ende der 1980er Jahre von Silicon Graphics für ihre damaligen Grafik-Workstations entwickelt. Die erste Programmierschnittstelle, die einen Akkumulationspuffer unterstützte, war daher das herstellereigene IRIS GL. Das 1992 veröffentlichte OpenGL 1.0 enthielt ebenfalls eine Unterstützung des Konzepts.
In der Folge setzte sich für Standard-Grafikhardware anderer Hersteller ein hardwareunterstützter Akkumulationspuffer zunächst nicht durch. Dies lag an dem erheblichen zusätzlichen Aufwand zur Hardwareunterstützung von Framebuffern mit mehr als 8 Bit Farbtiefe pro Farbkanal, die für eine sinnvolle Nutzung des Akkumulationspuffer nötig sind und von der OpenGL-Spezifikation erfordert werden. Dieser Aufwand für einen relativ begrenzten Nutzen schien in den Augen der meisten Grafikhardwarehersteller nicht gerechtfertigt. So war der Akkumulationspuffer meist nur durch den Gerätetreiber in Software realisiert und darum in Anwendungen extrem langsam.
Dies änderte sich erst ab 2002 mit Grafikkarten neuerer Generation, die intern Gleitkommazahlen für die Farbkanäle von Texturen und nicht-sichtbarer Framebuffer verwenden konnten. Die erste Grafikkarte dieser Art war die ATI Radeon 9700. Dadurch kann der Treiber einer Grafikkarte den Akkumulationspuffer intern durch die Hardware emulieren. Damit ist die Verwendung mit aktuellen Grafikkarten in hoher Geschwindigkeit möglich.
Zur Unterstützung von Antialiasing hat der Akkumulationspuffer allerdings mittlerweile seine Bedeutung verloren, weil die Grafikhardware für diesen Effekt spezielle Verfahren vorgesehen hat.
Literatur
- Paul Haeberli und Kurt Akeley: “The Accumulation Buffer: Hardware Support for High-Quality Rendering” (PDF-Datei; 3,30 MB), in: SIGGRAPH ’90 Conference Proceedings, S. 309–318.