อะไรคือแนวคิดและความแตกต่างระหว่าง Framebuffer และ Renderbuffer ใน OpenGL


139

ฉันสับสนเกี่ยวกับแนวคิดของ Framebuffer และ Renderbuffer ฉันรู้ว่าจำเป็นต้องแสดงผล แต่ฉันต้องการทำความเข้าใจก่อนใช้

ฉันรู้ว่าจำเป็นต้องใช้บัฟเฟอร์บิตแมปเพื่อเก็บผลการวาดชั่วคราว บัฟเฟอร์ด้านหลัง และจะต้องเห็นบัฟเฟอร์อื่น ๆ บนหน้าจอเมื่อภาพวาดเหล่านั้นกำลังดำเนินการอยู่ บัฟเฟอร์ด้านหน้า แล้วพลิกและวาดอีกครั้ง ฉันรู้แนวคิดนี้ แต่มันยากที่จะเชื่อมโยงวัตถุเหล่านั้นกับแนวคิดนี้

แนวคิดและความแตกต่างของพวกเขาคืออะไร?


7
Renderbuffer เป็นส่วนประกอบคล้ายช่องสัญญาณ (สีลายฉลุความลึกและอื่น ๆ ) ของ Framebuffer ดู: developer.apple.com/iphone/library/documentation/3DDrawing/…
eonil

2
ลิงก์นี้ใช้เฉพาะสำหรับ iPhone แต่มีการอธิบาย framebuffers เป็นอย่างดี
j00hi

คำตอบ:


62

หน้านี้มีรายละเอียดบางอย่างซึ่งฉันคิดว่าอธิบายความแตกต่างได้ดีทีเดียว ประการแรก:

ปลายทางแสดงผลขั้นสุดท้ายของท่อ OpenGL จะเรียกว่า [ที่] framebuffer

ในขณะที่:

Renderbuffer Object
นอกจากนี้ยังมีการนำเสนอ renderbuffer object ใหม่สำหรับการแสดงผลนอกจอ ช่วยให้สามารถแสดงฉากไปยังวัตถุ renderbuffer ได้โดยตรงแทนที่จะแสดงผลไปยังวัตถุพื้นผิว Renderbuffer เป็นเพียงออบเจ็กต์จัดเก็บข้อมูลที่มีภาพเดียวของรูปแบบภายในที่แสดงผลได้ ใช้เพื่อจัดเก็บโลจิคัลบัฟเฟอร์ OpenGL ที่ไม่มีรูปแบบพื้นผิวที่สอดคล้องกันเช่นสเตนซิลหรือบัฟเฟอร์ความลึก


199

Framebufferวัตถุไม่จริงบัฟเฟอร์ แต่วัตถุรวบรวมที่มีหนึ่งหรือมากกว่าสิ่งที่แนบมาซึ่งจากการเปิดของพวกเขาเป็นบัฟเฟอร์ที่เกิดขึ้นจริง คุณสามารถเข้าใจโครงสร้างFramebufferเป็น C โดยที่สมาชิกทุกคนเป็นตัวชี้ไปยังบัฟเฟอร์ หากไม่มีสิ่งที่แนบมาวัตถุFramebufferจะมีรอยเท้าต่ำมาก

ตอนนี้แต่ละบัฟเฟอร์ที่แนบมากับFramebufferสามารถเป็นRenderbufferหรือเนื้อ

Renderbufferเป็นบัฟเฟอร์จริง (อาร์เรย์ไบต์หรือจำนวนเต็มหรือพิกเซล) Renderbufferร้านค้าค่าพิกเซลในรูปแบบพื้นเมืองจึงเหมาะสำหรับการปิดหน้าจอแสดงผล กล่าวอีกนัยหนึ่งการวาดลงในRenderbufferอาจเร็วกว่าการวาดลงบนพื้นผิวมาก ข้อเสียคือพิกเซลใช้รูปแบบเนทีฟขึ้นอยู่กับการใช้งานดังนั้นการอ่านจากRenderbufferจึงยากกว่าการอ่านจากพื้นผิวมาก อย่างไรก็ตามเมื่อทาสี Renderbufferแล้วเราสามารถคัดลอกเนื้อหาไปยังหน้าจอได้โดยตรง (หรือไปยังRenderbufferอื่นฉันเดา) ได้อย่างรวดเร็วโดยใช้การถ่ายโอนพิกเซล ซึ่งหมายความว่าRenderbuffer สามารถใช้เพื่อใช้รูปแบบบัฟเฟอร์สองชั้นที่คุณกล่าวถึงได้อย่างมีประสิทธิภาพ

Renderbuffersเป็นแนวคิดที่ค่อนข้างใหม่ ก่อนหน้านี้มีการใช้Framebufferเพื่อแสดงผลเป็นพื้นผิวซึ่งอาจช้ากว่าเนื่องจากพื้นผิวใช้รูปแบบมาตรฐาน ยังคงเป็นไปได้ที่จะเรนเดอร์เป็นพื้นผิวและมีประโยชน์มากเมื่อเราต้องทำการส่งผ่านหลาย ๆ พิกเซลเพื่อสร้างฉากหรือวาดฉากบนพื้นผิวของฉากอื่น!

วิกิ OpenGL มีหน้านี้ที่แสดงรายละเอียดและลิงก์เพิ่มเติม


14
ขอบคุณ! การอธิบายว่ามันเหมือนกับโครงสร้างและตัวชี้มีความหมายสำหรับฉันมากขึ้น
DouglasHeriot

2
เรื่องนี้ยังค่อนข้างสับสนสำหรับฉัน หาก renderbuffer อนุญาตให้คัดลอกอย่างรวดเร็วไปยังบัฟเฟอร์การเรนเดอร์อื่นก็แทบจะไม่มีประโยชน์อะไรเลย! ถ้าฉันต้องทำขั้นตอนหลังการประมวลผล (เช่น SSAO) ไม่ใช่เรื่องง่ายกว่าการแสดงผลเป็นเฟรมบัฟเฟอร์เริ่มต้นโดยใช้การแสดงผลก่อนหน้านี้เป็นพื้นผิวมากกว่าการแสดงผลเป็น RenderBuffer แล้วคัดลอกกลับไปที่หน้าจอ?
CoffeDeveloper

4
บัฟเฟอร์การแสดงผลไม่ได้ออกแบบมาสำหรับการประมวลผลภายหลังแบบกำหนดเอง สามารถใช้เพื่อเก็บข้อมูลความลึกและลายฉลุสำหรับขั้นตอนการวาด เป็นไปได้เนื่องจากมีเพียงการติดตั้ง GPL เท่านั้นที่ต้องอ่านข้อมูล renderbuffer และมีแนวโน้มที่จะเร็วกว่าพื้นผิวเนื่องจากใช้รูปแบบดั้งเดิม หากคุณต้องการโพสต์การประมวลผลให้ใช้พื้นผิว
fernacolo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.