2008年11月28日 星期五

OpenGL 學習紀錄


OpenGL 學習紀錄




Overview of OpenGL operation



(1) App Memory 應用程式內存 :

Geomety 幾何對象. Pixel 像素
可能位於主CPU上或是圖形加速器上的視頻內存中.

(2) Per-Vertex Operations 逐個頂點操作

這個階段中發生的最重要的事情就是轉換和光照, 所以頂點操作階段有時也叫做"轉換和光照( TRANSFORMATION AND LIGHTING)", 或者是 "T&L".
處理完頂點之後, 與各個頂點相關聯的全部屬性就會完全得以確定.

(3) PRIMITIVE ASSEMBLY 圖元組裝

在這個階段, 頂點數據被結合成完整的圖元. 圖元組裝階段會有效的收集足夠的頂點以組成一個單獨的圖元.
之所以需要這個階段, 是因為接下來的一個階段會在一組頂點上執行操作, 且這些操作是依賴於圖元類型的.


(4) Clip Project Viewport  Cull:

這個處理階段包含了幾個不同的步驟. 

第一步是(Clip)剪裁, 將各個圖元(primitive)與用戶定義的剪裁平面(通過調用 glClipPlane 來設置) 以及由模型矩陣和投影矩陣建立的視景(view volume) 做比較. 去除或裁減顯示區外的部份. 使得被傳遞的只是他位於視景以及用戶定義的剪裁平面內部的那一部份.

另一個操作是 透視投影. 


(5) (Geometry) Resterize (Pixels):

在這個階段中圖元將被分解為更小的單位, 這些單位對應於目標楨緩衝區(frame buffer) 中的像素. 這個過程被稱為" 珊格化(RESTERIZATION)".
珊格化生成的各個更小的單元稱為"片元(Fragment)". 
EX: 例如一條直線可能在螢幕上包含了五個像素, 而珊格化(RESTERIZATION) 過程就是將這條(由兩個頂點定義的)直線轉換為5個片元(Fragment).
一個Fragment由一個窗口座標, 深度以及其他相關屬性(如顏色, 紋理座標等) 組成.


(6) Fragment Processing 片元處理:

這個階段最重要的動作稱為"上紋理(TEXTURING)". 在這個操作中, 與Fragment相關聯的Texture座標會被用來訪問一個名為"紋理內存(TEXTURE MEMORY)" (7)的圖形內存區域.
這個階段的其他操作是 "霧化" (根據fragment距離當前視點的位置修改其顏色) 和 "顏色會總" (將fragment的主顏色和次顏色的值結合在一起.

(8)  PER-FRAGMENT OPERATION 逐個片元操作:

包括下以內容:

像素所有權測試 - 確定目標像素是可見的還是被一個重疊的窗口蓋住了.

剪切測試 - 根據通過調用 glScissor 建立的一個矩形區域來剪裁fragment.

Alpha 測試 - 使用Fragment 的 alpha 值和通過調用 glAlphaFunc 建立的函數來確定是否丟棄fragment.

模板測試 - 使用通過 glStencilFunc 和 flStencilOp 建立的比較關西來將模版緩衝區中的值和一個參考值做比較, 以便確定fragment的命運.

深度測試 - 使用通過調用 flDepthFunc 建立的函數來將輸入 fragment的depth與 frame buffer 中儲存的 depth 做比較, 从而確定是否繪制frqagment.

混合 - 使用fragment 的顏色, 存儲在 frame buffer 的顏色以及通過調用 glBlendFunc, glBlendColor, and glBlendEquation 設置的混合狀態來確定要寫入 frame buffer的顏色.

抖動以及邏輯操作 - 使用通過調用 glLogicOp 建立的邏輯操作將最終的 fragment值與 frame buffer 中的值結合起來.


(9) FRAME BUFFER OPERATIONS 楨緩衝區操作:

控製或影響整個 FRAME BUFFER 的過程稱為 "Frame Buffer Operations".


(12) PIXEL UNPACKING 像素解碼:

將應用程序內存中讀取的像素, 轉換為一個連貫的像素流稱為 像素解碼.

通過調用 glPixelStore, 可以指定那些在內存中的像素數據的參數(如, 每個像素行的長度, 第一行之前要略過的行數, 每一行中第一個像素之前要略過的像素數等).
Parameters that define how the image data is stored in memory (length of each pixel row, number of rows to skip before the first one, number of pixels to skip before the first one in each row, etc.) can be specified with glPixelStore.

通過 glDrawPixels 這樣的調用將像素矩形傳輸到 OpenGL 時, 這個操作會應用當前的一組像素解碼參數來確定應該如何讀取和解析圖象數據.
When a pixel rectangle is transferred to OpenGL by a call like glDrawPixels, this operation applies the current set of pixel unpacking parameters to determine how the image data should be read and interpreted.

從內存中讀取各個像素時, 像素會被轉換為一個其中包含了顏色, 深度, 或模版值的"像素組 PIXEL GROUP".
As each pixel is read from memory, it is converted to a PIXEL GROUP that contains either a color, a depth, or a stencil value.

如果像素組由一個顏色組成, 那麼圖像數據就會被指定用於 frame buffer 中的顏色緩衝區.
If the pixel group consists of a color, the image data is destined for the color buffer in the frame buffer.

如果像素組由一個深度值組成, 那麼圖像數據就會被指定用於深度緩衝區.
If the pixel group consists of a depth value, the image data is destined for the depth buffer.

如果像素組由一個模板值組成, 那麼圖像數據就會被指定用於模板緩衝區.
If the pixel group consists of a stencil value, the image data is destined for the stencil buffer.

顏色值由紅色, 綠色, 藍色以及 alpha部分組成.

(13) PIXEL TRANSFER 像素傳輸:

像素傳輸階段的行為是通過 glPixelTransfer 來修改的. 這個命令可以設置一些狀態來控制是否縮放或者偏移紅色, 綠色 ,藍色, alpha 和 depth 值.
他還可以用來設置確定輸入的顏色或模版值是否通過使用一個查找表被映射定一個不同的顏色或模版值的狀態.
用於這些查找的查找表是通過 glPixelMap 命令來指定的.

在這個階段還發生的一些額外操作是 OpenGL "成像子集( IMAGE SUBSET)" 的一部份, 該子集是OpenGL的一個可選部分.
被定義為成像子集一部分的像素傳輸操作有 旋轉, 顏色矩陣, 直方圖, 最小/最大以及額外的顏色查找表.

(14)  (Geometry) Resterize (Pixels):

在像素傳輸階段之後, 是通過珊格化像素舉行的過程來生成fragment. 其方式與從3D幾何對象生成fragment非常相似. 
Following the pixel transfer stage, fragments are generated through rasterization of pixel rectangles in much the same way as they are generated from 3D geometry (14).

該過程和當前的 OpenGL 狀態一起決定了在 frame buffer中匯至圖像的位置.
This process, along with the current OpenGL state, determines where the image will be drawn in the frame buffer.

珊格化操作考慮到了當前的" 光珊位置( RASTER POSITION)" (可以通過調用 glRasterPos 或 glWindowPos 來設置) 以及當前的縮放因子(可以通過調用 glPixelZoom來設置, 他會導致在繪製圖像時放大或縮小圖像).
Rasterization takes into account the current RASTER POSITION, which can be set with glRasterPos or glWindowPos, and the current zoom factor, which can be set with glPixelZoom and which causes an image to be magnified or reduced in size as it is drawn.

EX: 通過對glTexImage or gl TexSubImage 的調用而提供的像素值不會經歷珊格化或者後面的fragment處理過程, 而是被直接用來更新 texture Memory的相應部份(15).



(16) Read Control 讀取控制

通過調用glReadPixels, 可以從 frame buffer 中讀取像素矩形並將其返回到應用程序內存中.
通過調用glCopyPixels, 還可以從 frame buffer 中讀取他們並將他們寫入frame buffer 的另一部份.
或者通過調用 glCopyTexImage or gl CopyTexSubImage 从 frame buffer 中讀取他們並將他們寫入 Texture Memory.
在所有這些情況下, 待讀取的 frame buffer 部分是由 OpenGL 的 "讀取控制 (READ CONTROL)" 階段控制, 並使用 glReadBuffer 命令設置的(16).

从 frame buffer 讀取回來的值再通過 像素傳輸階段(13) 發送, 在這個階段, 可能會執行不同的圖像處理操作. 
對複製操作而言, 得到的像素會被發送到 Texture Memory 或這發回 frame buffer , 具體情況取決於啟動這總傳輸的命令.
對於讀取操作, 則會在" 像素編碼 (PIXEL PACK)" 階段(17) 的控制下格式化像素, 以便將其存放於應用程式內存中.


沒有留言: