2010-02-06 79 views
101

我對Framebuffer和Renderbuffer的概念感到困惑。我知道他們需要渲染,但我想在使用前理解它們。OpenGL中Framebuffer和Renderbuffer的概念和區別是什麼?

我知道需要一些位圖緩衝區來存儲臨時繪製結果。後臺緩衝區。當這些繪圖正在進行時,需要在屏幕上看到另一個緩衝區。前臺緩衝區。 並翻轉它們,然後再次繪製。我知道這個概念,但很難將這些對象連接到這個概念。

他們的概念和差異是什麼?

+5

Renderbuffer是Framebuffer的通道組件(顏色,模板,深度等)。請參閱:http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESonthe iPhone/OpenGLESonthe iPhone.html – Eonil 2010-09-05 10:28:38

+0

該鏈接是iPhone特定的,但幀緩衝區很好解釋。 – j00hi 2011-03-17 15:08:01

回答

51

This page有一些細節,我認爲很好地解釋了這種差異。首先:

OpenGL流水線的最終渲染目的地被稱爲[the] framebuffer

鑑於:

渲染對象
此外,渲染對象是新推出的對離屏渲染。它允許將場景直接渲染到渲染緩衝區對象,而不是渲染到紋理對象。渲染緩衝區只是一個數據存儲對象,其中包含可呈現的內部格式的單個圖像。它用於存儲沒有相應紋理格式的OpenGL邏輯緩衝區,如模板或深度緩衝區。

+0

完美。謝謝! – Eonil 2010-02-06 12:45:23

144

幀緩衝區對象是不實際的緩衝器,但包含一個或多個附件,其通過輪到他們,是實際的緩衝器的聚合對象。您可以將Framebuffer理解爲C結構,其中每個成員都是指向緩衝區的指針。沒有任何附件,Framebuffer對象的佔位面積非常小。

現在連接到幀緩衝區每個緩衝器可以是一個渲染紋理

Renderbuffer是一個實際的緩衝區(字節,整數或像素數組)。 Renderbuffer以原生格式存儲像素值,因此它針對屏外渲染進行了優化。換句話說,繪製到Renderbuffer可能比繪製紋理要快得多。缺點是像素使用原生的,與實現相關的格式,因此從Renderbuffer讀取比從紋理讀取困難得多。儘管如此,一旦繪製了一個渲染緩衝區,我們可以使用像素傳輸操作非常快速地將其內容直接複製到屏幕上(或者我猜其他Renderbuffer)。這意味着可以使用Renderbuffer高效地實現您提到的雙緩衝區模式。

Renderbuffers是一個比較新的概念。在他們之前,幀緩衝器被用來渲染到紋理,由於紋理使用標準格式,紋理可能會變慢。仍然可以渲染到紋理,當需要在每個像素上執行多個遍歷來構建場景或在另一個場景的表面上繪製場景時,這仍然非常有用!

該OpenGL維客有this page,顯示更多的細節和鏈接。

+9

謝謝!把它解釋成像結構和指針一樣對我來說更有意義。 – DouglasHeriot 2013-05-17 13:44:46

+2

這對我來說仍然有點困惑。如果渲染緩衝區只允許快速複製到另一個渲染緩衝區,那麼幾乎沒有用處!如果我必須做一個後期處理階段(如SSAO),使用之前呈現給紋理的渲染到RenderBuffer然後複製回屏幕不是更容易將其渲染爲默認幀緩衝區? – GameDeveloper 2015-01-12 10:29:43

+3

渲染緩衝區不適用於自定義後期處理。它們可用於存儲繪圖程序的深度和模板信息。這是可能的,因爲只有GPL實現本身需要讀取渲染緩衝區數據,並且往往比紋理更快,因爲它使用本機格式。 如果您需要後處理,請使用紋理。 – fernacolo 2015-01-12 23:20:59