介紹3---Frame Buffer

實際上,OGL的輸出並不一定直接修改on screen buffer。有三種可能情況:

1. 下圖中的bufer就是on screen buffer,或者是on screen buffer的一部分,此時,OGL的輸出直接修改on screen buffer的內容。

【擴展】當應用程序以front buffer作爲draw buffer,或者選擇single buffer時,是這樣的情況,但是屏幕很有可能會出現閃爍現象。

2. buffer是獨立於on screen buffer的存在,OGL首先輸出到buffer中,然後再在適當的時候,將buffer中的數據拷貝到on screen buffer中。buffer的大小可以和on screen buffer相同,也可以小於on screen buffer。

【擴展】這種方法被稱爲blit

3. buffer是獨立於on screen buffer的存在,而且兩者的大小是相同的,也就是說,這是一個全屏的程序,OGL首先輸出到buffer中,然後再在適當的時候,將這塊buffer當做on screen buffer交給Display Controller輸出到顯示設備中。

xxx

 

 

 實際上,OGL的輸出除了影響on screen buffer外,還有一些其他輸出。在此之前,我們先來了解Fragment的概念。

 

我們知道,顯示器是由像素pixel組成的,每個像素都有其顏色color信息;OGL的輸出由fragment組成,其和pixel在位置上是一一對應的。每個fragment不僅有color信息,也有諸如depth、stencil等信息,這些信息被輸出到不同的buffer中。上圖描述的是fragment的color信息,其中的buffer即color buffer。

 

【說明】depth、stencil的意義將在以後解釋。

 

接收color信息的buffer被稱爲color buffer,接收depth信息的buffer被稱爲爲depth buffer,接收stencil信息的buffer被稱爲stencil buffer。根據配置不同,可能不存在depth buffer和stencil buffer,如果存在的話,則只有一份。而color buffer則有多份,比如front color buffer、back color buffer等,OGL可以將結果輸出到合適的color buffer中,再在合適的時機反映到on screen buffer進行顯示。所有的這些buffer組合,被稱爲frame buffer。

4

 

Frame Buffer是和窗口綁在一起的,也就是說,只有在用Win32 API(Win系統)或者X函數(Linux/X系統)創建一個窗口後,然後才因而衍生出Frame Buffer;而用OGL在窗口繪製的本質,就是將OGL的結果輸出到窗口相關的Frame Buffer中後顯示。

 

【擴展】在2008年提出的frame buffer object技術取消了frame buffer必須依賴窗口的限制,也就是說,OpenGL Spec擴展了對Frame Buffer的支持,不需要基於窗口即可創建出frame buffer,但是,這個frame buffer是off screen的,是無法被顯示出來的,所以,一般可以作爲中間計算結果。如果要想最終的顯示,必須先創建一個窗口,然後改變該窗口所衍生的frame buffer中的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章