2012-10-15 7 views
7

Vor nicht allzu langer Zeit habe ich ein Programm aus einem OpenGL-Handbuch ausprobiert, das doppelt gepuffert sein soll; Es zeigte ein sich drehendes Rechteck auf dem Bildschirm. Leider habe ich das Buch nicht mehr, und ich habe keine klare, klare Definition dessen gefunden, was ein Puffer im Allgemeinen ist. Meine Vermutung ist, dass es sich um einen "Ort" handelt, an dem Dinge gezeichnet werden können, bei denen viel wie Schichten wirken kann?Was genau ist ein Puffer in OpenGL, und wie kann ich mehrere zu meinem Vorteil verwenden?

Wenn das der Fall ist, frage ich mich, ob ich mehrere Puffer zu meinem Vorteil für ein Polygon-Clipping-Programm verwenden kann. Ich habe ein nettes kleines Fenster, das dem Benutzer erlaubt, Polygone auf dem Bildschirm zu zeichnen, plus ein Dienstprogramm, um eine Auswahlbox über die Polygone zu ziehen und zu zeichnen. Wenn der Benutzer das Auswahlrechteck gezeichnet hat und die Maus loslässt, werden die Polygone basierend auf den Rechteckgrenzen abgeschnitten.

Das ist machbar genug, aber ich möchte auch, dass der Benutzer von vorne beginnen kann: Wenn die Escape-Taste gedrückt wird, sollte die Clip-Box verschwinden, und die ursprünglichen Polygone sollten wiederhergestellt werden. Da ich die Dinge Pixel für Pixel mache, scheint es sehr schwierig zu sein, herauszufinden, wie man die Rechteckpixelfarben wieder zurück in Schwarz wie den Hintergrund oder die Farbe eines bestimmten Polygons ändert, je nachdem, wo sie gezeichnet wurden (außer ich finde eine Möglichkeit, die Farben zu speichern, wenn jedes Polygonpixel gezeichnet wird, aber das scheint über Bord zu gehen). Ich habe mich gefragt, ob es helfen würde, dem Rechteck einen eigenen Puffer zu geben, in der Hoffnung, dass es sich wie eine Art transparente Schicht verhält, die leicht gelöscht werden könnte. So können Puffer verwendet werden, oder brauche ich sie um eine andere Lösung zu finden?

Antwort

8

OpenGL mehrere Arten von Puffern nicht kennt:

  • Framebuffer: Teile des Speichers an die Zeichenoperationen gerichtet sind Pixelwerte in dem Puffer zu verändern. OpenGL verfügt standardmäßig über Bildschirmpuffer, die in einen Front- und einen Backbuffer aufgeteilt werden können, wobei Zeichnungsoperationen auf dem Backbuffer unsichtbar sind und beim Beenden in die Front getauscht werden. Zusätzlich dazu verwendet OpenGL einen Tiefenpuffer für die Tiefenprüfung der Z-Sortimplementierung, einen Schablonenpuffer, der verwendet wird, um das Rendering auf Ausschnitte (= Schablone) wie ausgewählte Teile des Framebuffers zu beschränken. Früher gab es Hilfs- und Akkumulationspuffer. Diese wurden jedoch durch sogenannte Framebuffer-Objekte ersetzt, bei denen es sich um vom Benutzer erstellte Objekte handelt, die mehrere Texturen oder Renderbuffer zu neuen Framebuffern kombinieren, die gerendert werden können.

  • Renderbuffers: Vom Benutzer erstellte Renderziele, die an Framebufferobjekte angehängt werden.

  • Pufferobjekte (Vertex und Pixel): Benutzerdefinierter Datenspeicher. Wird für Geometrie- und Bilddaten verwendet.

  • Texturen: Texturen sind eine Art Puffer, das heißt, sie halten Daten, die Quellen in Zeichenoperationen sein können

Der übliche Ansatz mit OpenGL ist die ganze Szene rerender, wenn sich etwas ändert. Wenn Sie diese Zeichenoperationen speichern möchten, können Sie den Inhalt des Framebuffers in eine Textur kopieren und diese Textur dann auf ein einzelnes Viereck zeichnen und mit Ihrem Auswahl-Gummiband-Rechteck überzeichnen.