Was ist das Konzept und die Unterschiede zwischen Framebuffer und Renderbuffer in OpenGL?

136

Ich bin verwirrt über das Konzept von Framebuffer und Renderbuffer. Ich weiß, dass sie gerendert werden müssen, aber ich möchte sie vor der Verwendung verstehen.

Ich weiß, dass ein Bitmap-Puffer erforderlich ist, um das temporäre Zeichnungsergebnis zu speichern. Der Rückpuffer. Der andere Puffer muss auf dem Bildschirm angezeigt werden, wenn diese Zeichnungen ausgeführt werden. Der vordere Puffer. Und drehe sie um und zeichne erneut. Ich kenne dieses Konzept, aber es ist schwierig, diese Objekte mit diesem Konzept zu verbinden.

Was ist das Konzept und die Unterschiede von ihnen?

eonil
quelle
7
Renderbuffer ist eine kanalähnliche Komponente (Farbe, Schablone, Tiefe usw.) von Framebuffer. Siehe: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil
2
Der Link ist iPhone-spezifisch, aber Framebuffer sind gut erklärt.
J00hi

Antworten:

62

Diese Seite enthält einige Details, die meiner Meinung nach den Unterschied recht gut erklären. Zuerst:

Das endgültige Rendering-Ziel der OpenGL-Pipeline heißt [der] Framebuffer .

Wohingegen:

Renderbuffer-Objekt
Zusätzlich wurde das Renderbuffer-Objekt für das Offscreen-Rendering neu eingeführt. Es ermöglicht das Rendern einer Szene direkt in ein Renderbuffer-Objekt, anstatt in ein Texturobjekt zu rendern. Renderbuffer ist einfach ein Datenspeicherobjekt, das ein einzelnes Bild eines renderbaren internen Formats enthält. Es wird verwendet, um logische OpenGL-Puffer zu speichern, die kein entsprechendes Texturformat haben, z. B. Schablonen- oder Tiefenpuffer.

ChrisF
quelle
196

Das Framebuffer- Objekt ist eigentlich kein Puffer, sondern ein Aggregatorobjekt, das einen oder mehrere Anhänge enthält, die wiederum die eigentlichen Puffer sind. Sie können den Framebuffer als C-Struktur verstehen , bei der jedes Mitglied ein Zeiger auf einen Puffer ist. Ohne Anhang hat ein Framebuffer- Objekt einen sehr geringen Platzbedarf.

Jetzt kann jeder an einen Framebuffer angehängte Puffer ein Renderbuffer oder eine Textur sein .

Der Renderbuffer ist ein tatsächlicher Puffer (ein Array von Bytes oder Ganzzahlen oder Pixeln). Der Renderbuffer speichert Pixelwerte im nativen Format und ist daher für das Rendern außerhalb des Bildschirms optimiert. Mit anderen Worten, das Zeichnen in einen Renderbuffer kann viel schneller sein als das Zeichnen in eine Textur. Der Nachteil ist, dass Pixel ein natives, implementierungsabhängiges Format verwenden, sodass das Lesen aus einem Renderbuffer viel schwieriger ist als das Lesen aus einer Textur. Sobald ein Renderbuffer gezeichnet wurde, kann man seinen Inhalt jedoch sehr schnell mithilfe von Pixelübertragungsvorgängen direkt auf den Bildschirm (oder auf einen anderen Renderbuffer , glaube ich) kopieren . Dies bedeutet, dass ein Renderbuffer kann verwendet werden, um das von Ihnen erwähnte Doppelpuffermuster effizient zu implementieren.

Renderbuffer sind ein relativ neues Konzept. Vor ihnen wurde ein Framebuffer verwendet, um eine Textur zu rendern , die langsamer sein kann, da eine Textur ein Standardformat verwendet. Es ist immer noch möglich, eine Textur zu rendern, und das ist sehr nützlich, wenn Sie mehrere Durchgänge über jedes Pixel ausführen müssen, um eine Szene zu erstellen oder eine Szene auf einer Oberfläche einer anderen Szene zu zeichnen!

Das OpenGL-Wiki enthält diese Seite mit weiteren Details und Links.

fernacolo
quelle
13
Vielen Dank! Es ist für mich viel sinnvoller, es als eine Art Struktur und Zeiger zu erklären.
DouglasHeriot
2
Das ist für mich immer noch etwas verwirrend. Wenn der Renderpuffer nur ein schnelles Kopieren in einen anderen Renderpuffer zulässt, ist dies fast sinnlos! Wenn ich eine Nachbearbeitungsphase (wie SSAO) durchführen muss, ist es nicht einfacher, sie mit zuvor in Texturen gerenderten Bildern in den Standard-Framebuffer zu rendern, als sie in einen RenderBuffer zu rendern und dann wieder auf den Bildschirm zu kopieren?
CoffeDeveloper
4
Renderpuffer sind nicht für die benutzerdefinierte Nachbearbeitung vorgesehen. Sie können verwendet werden, um Tiefen- und Schabloneninformationen für einen Zeichenvorgang zu speichern. Dies ist möglich, weil nur die GPL-Implementierung selbst Renderbuffer-Daten lesen muss und tendenziell schneller als Texturen ist, da ein natives Format verwendet wird. Wenn Sie eine Nachbearbeitung benötigen, verwenden Sie Texturen.
Fernacolo