1. 程式人生 > >深入瞭解OpenGL——幀快取

深入瞭解OpenGL——幀快取

OpenGL是一個用於話圖形的API,因此,OpenGL的首要目的就是將來自一個應用程式所提供的資料變換為能在顯示螢幕上看得到的東西。這個過程通常被引用為繪製(RENDERING)。一般,這個過程由專門設計的硬體進行加速,但OpenGL流水線的某些或所有操作可以被一個執行在CPU上的一個軟體實現執行。OpenGL實現如何在硬體和軟體之間進行分工對使用者而言是透明的(無需知道的)。重要的是繪製的結果要遵從由OpenGL詳細說明書中定義的結果。

專用於畫圖形並維護顯示屏內容的硬體經常被稱為圖形加速器。圖形加速器一般有一個專用於維護顯示內容的儲存器區域。顯示器的每個可見的圖片元素(畫素)在圖形加速器上用若干個位元組表示。一個彩色顯示器可能對每個紅、綠、藍對應一個位元組,為了表示每個畫素的顏色值。這個所謂的顯示儲存器每秒需要被掃描(重新整理)若干次,為了要在顯示器上維護無閃爍的畫面顯示。影象加速器一般也有一個稱為離屏儲存器的區域

,該儲存器區域不能用來顯示,並用於儲存一些不可見的東西。

OpenGL假定顯示儲存和離屏儲存的分配由視窗系統處理。視窗系統決定儲存器的那一部分可以被OpenGL訪問,並且這些部分如何被結構化。在OpenGL所支援的每個環境中,有一小組函式呼叫將OpenCL繫結到特定的環境。在微軟的Windows環境下,這組例程被稱為WGL。在X Window系統環境下,這組例程被稱為GLX。在Apple的Macintosh環境下,這組例程被稱為NSOpenGL(Cocoa Window/View),CGL(Core GL)或AGL(Carbon Window)。在每個環境下,這組呼叫支援諸如分配、釋放圖形處理器儲存,分配和釋放所謂的圖形上下文

(用於維護OpenGL的狀態),選擇當前圖形上下文,選擇圖形儲存區域(在此區域中,用於畫畫以及在OpenGL和視窗系統之間同步命令)等這些事情。

需要作為OpenGL繪製結果而被修改的圖形儲存器區域被稱為幀快取(Framebuffer)。在一個視窗系統中,一個預設的幀快取的OpenGL概念對應於一個視窗。在視窗系統特定的OpenGL例程中的工具讓使用者為視窗選擇預設的幀快取特徵。視窗系統一般也需要闡明當多個視窗疊交時,OpenGL預設幀快取的行為。在一個非視窗系統中,OpenGL預設的幀快取對應於整個顯示。

一個支援OpenGL繪製的視窗(即,一個預設的幀快取)可以由以下一些組合構成:

*多達四個顏色快取

*一個深度快取

*一個模板快取

*一個多重取樣(MSAA)快取

*一個或多個輔助快取

大多圖形硬體同時支援一個前臺快取和一個後臺快取,為了實現雙緩衝。這允許應用程式在後臺顯示(可見的)前臺快取的同時又繪製(離屏的)後臺快取。當繪製完成時,兩個快取進行交換,這樣完成繪製後的快取可以作為前臺快取進行顯示,而原來的前臺快取可以作為新的後臺快取進行繪製。當雙快取被使用時,終端使用者將一直看不到正被繪製的圖形,而只能看到完成後的影象。這個技術允許互動式幀率的平滑動畫。

通過讓一個顏色快取對應左眼,一個對應右眼,即能支援立體檢視。雙重快取能通過擁有一個前臺快取和一個後臺快取來支援。一個被雙緩衝的立體視窗將從而有四個顏色快取:前左、前右、後左、後右。一個正常的(非立體的)被雙緩衝的視窗將有一個前臺快取和一個後臺快取。一個被但緩衝的視窗將只有一個前臺快取。

如果3D物件伴隨著隱藏表面剔除被畫出,那麼需要一個深度快取。這個快取存放被顯示物件的每個畫素的深度值。當要畫額外的物件時,需要對每個畫素做一次深度比較,來確定是可見的還是被阻擋的。

模板(stencil)快取用於複雜的遮蔽操作。一個複雜的形狀可以被儲存在模板快取中,並且後面的繪製操作可以根據模板快取的內容來確定是否需要更新每一個畫素。

正常地,當繪製物件時,對於圖形圖元是否影響螢幕上的一個畫素可以做一個簡單的判斷。多重取樣快取允許所有被繪製到該快取中的物件在每個物件內被多次取樣以實現高質量的全屏反走樣(抗鋸齒),而不需要繪製該幀超過一次。在一個畫素中的每個樣本都含有顏色、深度和模板資訊,並且每個畫素的樣本個數可以被查詢。當一個視窗包含一個多重取樣快取時,它並不包含獨立的深度或模板快取。當物件被繪製時,顏色樣本被連結,以產生一單個顏色值,並且那個值被繼續傳遞,寫入顏色快取。因為多重取樣快取包含多個顏色、深度、模板的樣本(經常為2,4,8或16)為視窗中的每個畫素。它們可以用盡大量的離屏圖形儲存。

輔助快取是離屏儲存緩衝,它們可以存放任意的資料,諸如一個多遍繪製演算法的中間結果。一個幀快取可以有1,2,3,4甚至更多相關聯的輔助快取。

除了預設的幀快取外,OpenGL提供了幀快取物件。這些是應用程式建立的幀快取,並且比視窗系統預設的幀快取更靈活。幀快取物件可以有幾種不同格式的快取,包括規格化的格式(存放在0.0到1.0範圍內的數字),帶符號的規格化的格式(存放在-1.0到1.0範圍內的數字),帶符號和無符號整型,和浮點型數字。