(僅是草稿,未做整理)
第二章
2 OpenGL ES運行
2.1 OpenGL ES基本原理
OpenGL ES(後續稱為“GL”)被關注的只是幀緩衝中的渲染(和從幀緩衝讀出已儲存的數值)。在一些情況並不支援與圖形硬體相關的外圍裝置,如滑鼠,鍵盤。程式員必須依靠其他的機制來獲得輸入資訊,如Khronos OpenKODEAPI。
GL畫基本元素取決於幾個可選的模式。每個基本元素主要是點,線或者三角形。每種模式可以獨立地改變,即其中的一種設定不會影響到其他的設定。但還是有許多模式會想到影響來決定在幀緩衝中最終會以什麼形式結束。設定好模式,定義好基本元素及其他的GL操作被描述成發送命令,命令的形式為函數或程序呼叫。
基本元素是定義成一個集合包含一個或多個頂點(vertices)。一個頂點(vertex)即一個點,一個邊的終點或者當兩邊交匯時的三角形的一個角。資料(位置座標, 顏色,正交和紋理座標)與頂點相關聯。每個頂點是獨立,有序,並且是以相同的方式進行處理。其中此規則有一個例外:如果集合中的頂點要翻轉(clipped),這意味著基本元素是在個特定的地區中,在這種情況下,頂點資料可能被修改或建立新的頂點資料。翻轉的類型取決於頂點集合所表示的哪一種基本元素。
命令的處理經常是以所接收到的順序進行,但識別一個命令影響之前,也會有不可確定的延時。這意味著,一個基本元素需要在任何後續會影響幀緩衝的命令之前完成此元素的畫操作。同時也意味著,查詢和像素讀取操作返回狀態必須與在所有先前有關GL命令完成後具有一致性。總的說,在GL模式和幀緩衝的命令的有效性,必須在任何後續有些影響的命令之前完成操作。
在GL中,當調用函數時,會進行資料繫結。這意味著,當接收到命令的時候,傳遞到命令資料已經解析完成。即使命令需要一個點資料,一旦命令被調用,這些資料也會被解析,而任何後續命令改變此資料也不會影響當前GL,除非相同的指標被用在後續的命令中。
GL可以直接控制3D和2D的基本操作。包括矩陣變換,光線均衡係數,反鋸齒方法,像素更新操作。但沒有提供描述或模型化一個複雜幾何對象的方法。可以這麼說,GL提供了描述一個複雜的幾何對象如何渲染的機制,而不是為複雜的幾何對象本身提供了描述機制。
GL命令的模式是C/S。程式員(用戶端)發出命令,GL(服務端)解析這些命令。一個服務端也許會維護若干個GL上下文(Context),每個上下文是當前GL狀態的個封裝。一個用戶端可以選擇接入(connect)其中的一個上下文。當未串連的時候,發出一個GL命令,其結果是未知的。
GL命令對幀緩衝的影響最終是由視窗系統所分配的幀緩衝資源所控制。只有視窗系統決定著在給定時間下GL可訪問的幀緩衝部分,和與GL如何組織這些部分之間進行通訊。所以沒有GL命令來設定幀緩衝或者初始化GL。簡單說,在LCD面板或顯示器上顯示一個幀緩衝的內容(包括圖形校正技術:獨立幀快取資料的轉換)並不是由GL來控制。幀緩衝配置是在GL和視窗系統串連處之外進行的,初始化GL上下文是在視窗系統分配一個視窗給GL渲染時進行的。EGL API定義了一個可移植的機制來建立一個GL上下文和一個可用於渲染的視窗資源,通過此可以串連不同的視窗原始平台。
GL被設計成在一系列的具有不同的圖形處理功能和效能的圖形平台上運行。為達到此目的,我們定義了一個理想行為而不是一個現實的行為來確定GL操作。因此與這些理想狀態有偏差也是允許的。如果它能近似於理想行為,我們也定義了實現GL必須遵守的法則。這樣就允許多樣性,即在GL行為中意指,當以兩個相同輸入時運行一樣的幀緩衝配置中,可以有兩種不同GL實現也許並不能實現像素對像素吻合。
最後,命令名,常量,和類型以GL(在c語言中gl,gl_,GL)為首碼,這樣可以與其他包減少命名衝突。為了清晰描述,這些首碼在此文檔中被省略。