Apa konsep dan perbedaan antara Framebuffer dan Renderbuffer di OpenGL?

136

Saya bingung tentang konsep Framebuffer dan Renderbuffer. Saya tahu mereka harus membuat, tetapi saya ingin memahaminya sebelum digunakan.

Saya tahu beberapa buffer bitmap diperlukan untuk menyimpan hasil gambar sementara. Penyangga belakang. Dan buffer lain diperlukan untuk dilihat di layar ketika gambar-gambar itu sedang berlangsung. Buffer depan. Dan balik mereka, dan gambar lagi. Saya tahu konsep ini, tetapi sulit untuk menghubungkan objek-objek itu dengan konsep ini.

Apa konsep dan perbedaannya?

eonil
sumber
7
Renderbuffer adalah komponen seperti saluran (warna, stensil, kedalaman, dan lain-lain) dari Framebuffer. Lihat: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil
2
Tautan ini khusus untuk iPhone, tetapi pembuat bingkai dijelaskan dengan baik.
j00hi

Jawaban:

62

Halaman ini memiliki beberapa detail yang menurut saya menjelaskan perbedaannya dengan cukup baik. Pertama:

Tujuan rendering akhir dari pipa OpenGL disebut framebuffer [the] .

Sedangkan:

Objek Renderbuffer
Selain itu, objek renderbuffer baru diperkenalkan untuk rendering layar. Hal ini memungkinkan untuk membuat adegan langsung ke objek renderbuffer, alih-alih rendering ke objek tekstur. Renderbuffer hanyalah objek penyimpanan data yang berisi satu gambar dari format internal yang dapat di render. Ini digunakan untuk menyimpan buffer logis OpenGL yang tidak memiliki format tekstur yang sesuai, seperti stensil atau buffer kedalaman.

ChrisF
sumber
196

The Framebuffer objek adalah tidak benar-benar buffer, tetapi obyek aggregator yang berisi satu atau lebih lampiran, yang oleh giliran mereka, adalah buffer yang sebenarnya. Anda dapat memahami Framebuffer sebagai struktur C di mana setiap anggota adalah penunjuk ke buffer. Tanpa lampiran apa pun, objek Framebuffer memiliki jejak yang sangat rendah.

Sekarang setiap buffer yang dilampirkan ke Framebuffer dapat berupa Renderbuffer atau tekstur .

The renderbuffer adalah penyangga yang sebenarnya (array byte, atau bilangan bulat, atau piksel). The renderbuffer toko nilai piksel dalam format asli, sehingga dioptimalkan untuk offscreen rendering. Dengan kata lain, menggambar ke Renderbuffer bisa jauh lebih cepat daripada menggambar ke tekstur. Kekurangannya adalah bahwa piksel menggunakan format asli, tergantung pada implementasi, sehingga membaca dari Renderbuffer jauh lebih sulit daripada membaca dari tekstur. Namun demikian, begitu Renderbuffer dilukis, orang dapat menyalin kontennya langsung ke layar (atau Renderbuffer lain , saya kira), sangat cepat menggunakan operasi transfer piksel. Ini berarti Renderbuffer dapat digunakan untuk mengimplementasikan pola penyangga ganda yang Anda sebutkan secara efisien.

Renderbuffers adalah konsep yang relatif baru. Sebelum mereka, Framebuffer digunakan untuk membuat tekstur , yang bisa lebih lambat karena tekstur menggunakan format standar. Masih dimungkinkan untuk membuat tekstur, dan itu cukup berguna ketika seseorang perlu melakukan beberapa lintasan melewati setiap piksel untuk membangun adegan, atau untuk menggambar adegan di permukaan adegan lain!

Wiki OpenGL memiliki halaman ini yang menunjukkan lebih banyak detail dan tautan.

fernacolo
sumber
13
Terima kasih! Menjelaskannya sebagai semacam struct dan pointer seperti jauh lebih masuk akal bagi saya.
DouglasHeriot
2
Ini masih agak membingungkan bagi saya. Jika renderbuffer hanya memperbolehkan penyalinan cepat ke buffer render lain, maka hampir tidak ada gunanya! Jika saya harus melakukan tahap pasca-pemrosesan (seperti SSAO) tidak lebih mudah menjadikannya sebagai framebuffer default menggunakan yang sebelumnya diberikan ke Tekstur daripada mengubahnya ke RenderBuffer dan kemudian menyalin kembali ke layar?
CoffeDeveloper
4
Buffer render tidak dirancang untuk pasca-pemrosesan kustom. Mereka dapat digunakan untuk menyimpan informasi kedalaman dan stensil untuk prosedur menggambar. Ini dimungkinkan karena hanya implementasi GPL yang perlu membaca data renderbuffer, dan cenderung lebih cepat daripada tekstur, karena menggunakan format asli. Jika Anda membutuhkan pemrosesan pos, gunakan tekstur.
fernacolo