位元影像 字型
OpenGL不僅是一個完整的3D渲染介面,同時也是一個非常高效的影像處理引擎。本章主要討論OpenGL處理彩色像素和單位元影像的功能。
OpenGL並不會直接渲染映像,因為映像通常都是以特定的格式儲存在檔案裡面,OpenGL不知道這些影像檔的格式,因此它只知道怎樣渲染像素矩形,卻不會對影像檔進行解碼。如果前面所講,使用TGA、BMP、JPG檔案都需要自己寫解碼代碼。將像素資料解出來後,OpenGL就可以輕而易舉渲染了。
為了支援對像素矩形的渲染,除了基本的點、線、三角形、多邊形等幾何圖元外,OpenGL還支援基於像素的資料類型(pixel-based primitives)。這些基於像素的資料類型包含了每一個像素點的顏色值,可以分為兩類:位元影像(Bitmaps)和映像(Images)。
位元影像是一位的映像,包含每個像素的一位資訊,它可以作為掩碼來判斷要修改覆蓋哪個像素。使用glColor可以設定位元影像的使用中色彩。
映像則包含了每個像素的全部顏色資訊,如RGBA值。
當我們將類型BMP、GIF等這樣的影像檔資料進行解碼得到了相信的顏色資訊後,OpenGL就可以對這些顏色值進行光柵化。
如同渲染幾何形體有一個流水線一樣,像素渲染也有一個操作流水線。首先,從儲存地區(像檔案)讀取像素資料,將其處理成OpenGL內部可以使用的格式,期間包括一些顏色變換以及位元組交換的操作。然後使用片元操作(Fragment Operation)進行處理,最後將像素資料光柵化,渲染到框架緩衝區。整個流水線8-1所示。
圖8-1 像素渲染流水線
當然除了將像素資料渲染到框架緩衝區外,也可以將其從框架緩衝區複製到記憶體,或者變換到紋理映射空間,用於紋理貼圖。
為了得到最佳效能,對像素的內部處理應該和硬體相匹配。例如,對於24位的框架緩衝區,8-8-8 RGB格式可能就是最好的匹配,但是10-10-10 RGB格式肯定會出問題。非預設格式的變換即便成功,速度也會非常慢。
映像的位置是由光柵位置來決定的,它是將映像的左下角映射到空間中的一個點。如同頂點一樣,光柵位置也可以變換和裁減。如果光柵位置在裁減檢查時失敗,那麼OpenGL就會取消光柵化操作。
位元影像的渲染需要使用到的OpenGL命令主要有
glBitmap
glDrawPixels
glReadPixels
glCopyPixels
glCopyTex*Image
glRasterPos
下面我們來對這些常用的命令進行介紹。