2010-02-06 6 views
101

Ich bin verwirrt über das Konzept von Framebuffer und Renderbuffer. Ich weiß, dass sie gerendert werden müssen, aber ich möchte sie vor dem Gebrauch verstehen.Was ist das Konzept und die Unterschiede zwischen Framebuffer und Renderbuffer in OpenGL?

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

Was ist das Konzept und Unterschiede von ihnen?

+5

Renderbuffer ist kanalartige Komponenten (Farbe, Schablone, Tiefe und Etcs) von Framebuffer. Siehe: http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESontheiPhone/OpenGLESonheiPhone.html – Eonil

+0

Der Link ist iPhone spezifisch, aber Framebuffer sind gut erklärt. – j00hi

Antwort

51

This page hat einige Details, die den Unterschied recht gut erklären. Erstens:

Das finale Rendering Ziel der OpenGL-Pipeline genannt wird [das] Framebuffer.

Während:

Renderbuffer Objekt
Zusätzlich wird renderbuffer Objekt neu für Off-Screen-Rendering eingeführt. Sie können eine Szene direkt in ein renderbuffer-Objekt rendern, anstatt sie in ein Texturobjekt zu rendern. Renderbuffer ist einfach ein Datenspeicherobjekt, das ein einzelnes Bild eines darstellbaren internen Formats enthält. Es wird verwendet, um logische OpenGL-Puffer zu speichern, die nicht über das entsprechende Texturformat verfügen, z. B. einen Schablonen- oder Tiefenpuffer.

+0

Perfekt. Vielen Dank! – Eonil

144

Das Framebuffer-Objekt ist nicht wirklich ein Puffer, aber ein Aggregator-Objekt, das eine oder mehr Anlagen enthält, die durch die ihrerseits die eigentlichen Puffer sind. Sie können den Framebuffer als C-Struktur verstehen, wobei jedes Mitglied ein Zeiger auf einen Puffer ist. Ohne Befestigung hat ein Framebuffer Objekt sehr geringen Platzbedarf.

Nun hat jeder Puffer auf einen kann Framebuffer angebracht sein ein Renderbuffer oder eine Textur. Der Renderbuffer ist ein tatsächlicher Puffer (ein Array von Bytes oder Ganzzahlen oder Pixel). Der Renderbuffer speichert Pixelwerte im nativen Format und ist daher für das Offscreen-Rendering optimiert. Mit anderen Worten, die Zeichnung zu einem Renderbuffer kann viel schneller sein als das Zeichnen zu einer Textur. Der Nachteil ist, dass Pixel ein natives, implementierungsabhängiges Format verwenden, so dass das Lesen von einem Renderbuffer viel schwieriger ist als das Lesen von einer Textur. Dennoch, sobald ein Renderbuffer gemalt wurde, kann man seinen Inhalt direkt auf Bildschirm (oder andere Renderbuffer, denke ich) kopieren, sehr schnell mit Pixel-Transfer-Operationen. Dies bedeutet, dass ein Renderbuffer verwendet werden kann, um das von Ihnen erwähnte Doppelpuffermuster effizient zu implementieren.

Renderbuffers sind ein relativ neues Konzept.Vor ihnen wurde ein Framebuffer verwendet, um zu einer 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 man mehrere Pässe über jedem Pixel ausführen muss, um eine Szene zu erstellen, oder um eine Szene auf einer Oberfläche einer anderen Szene zu zeichnen! Das OpenGL-Wiki hat this page, die mehr Details und Links zeigt.

+9

Danke! Es als eine Art von Strukturen und Zeigern zu erklären, macht viel mehr Sinn für mich. – DouglasHeriot

+2

Das ist immer noch ein bisschen verwirrend für mich. Wenn renderbuffer nur einen schnellen Kopiervorgang in einen anderen Render-Puffer zulässt, dann ist das fast nutzlos! Wenn ich eine Nachbearbeitungsstufe (wie SSAO) machen muss, ist es nicht einfacher, sie auf den Standard-Framebuffer zu rendern, indem ich sie zuvor zu Texturen rendere, als sie in einen RenderBuffer zu rendern und dann wieder auf den Bildschirm zu kopieren? – GameDeveloper

+3

Render-Puffer sind nicht für die benutzerdefinierte Nachbearbeitung ausgelegt. Sie können verwendet werden, um Tiefen- und Schabloneninformationen für eine Zeichenprozedur zu speichern. Dies ist möglich, da nur die GPL-Implementierung selbst Render-Puffer-Daten lesen muss und dazu neigt, schneller als Texturen zu sein, da ein natives Format verwendet wird. Wenn Sie eine Nachbearbeitung benötigen, verwenden Sie Texturen. – fernacolo