前文中描述了opengl的影象格式,本文接著描述畫素格式
影象格式可以理解為對gpu中資料的解釋,那麼對於cpu端(也就是記憶體中)的資料解釋就是畫素格式的內容。
畫素資料一般會在cpu和gpu中進行傳輸,如果傳輸過程是從gpu到cpu一般稱為壓包(pack),從cpu到gpu的傳輸稱為解包(unpack)
在opengl中有許多函式會用到畫素的傳輸,主要包括兩類
1. 壓包操作:
glreadpixels
glgetteximage
解包操作:
glteximage*
gltexsubimage*
所有上面列舉的畫素傳輸類函式,都包含了一下三個引數,用來定義畫素的格式,這三個引數如下:
glenum format, glenum
type, void *data
這三個引數中:
data:指向記憶體中資料的指標或者是緩衝區物件的偏移量(由gl_pixel_pack_buffer、gl_pixel_unnpack_buffer是否有緩衝區物件繫結來決定data的含義是前者還是後者)
format和type:真正定義了在記憶體或者緩衝區中畫素資料的格式
這兩個引數在《opengl影象格式》中也有提到,只不過opengl影象格式把二者混合寫在一起了。(例如gl_rgba8i實際上通過解析它的format是rgba,type是gl_short)下面分別進行介紹。
記憶體中的畫素可以分為 顏色資料、深度資料、深度/模板資料、模板資料。顏色資料一般分為4個成分:r、g、b、a。深度和模板資料一般只有乙個成分。深度/模板資料是混合了深度和模板的資料,包含兩個成分。
format定義了一下的資料特性:
1. 畫素中的資料型別(是顏色、深度、深度/模板、模板)
2. 每乙個畫素的成分順序(是rgba還是bgra)
3. 對於顏色資料來說,是否需要轉換為浮點型別傳輸
format的定義格式和它的描述
format
描述資料型別
gl_depth_component
深度資料
浮點型gl_stencil_index
模板資料
浮點型gl_depth_stencil
深度模板資料
浮點型gl_red gl_green gl_blue gl_rg gl_rgb gl_bgr gl_rgba gl_bgra
顏色資料
浮點型
預設上面的資料都是浮點型別的,如果對於記憶體中的整型資料使用了上述浮點型別的標籤,那麼這些記憶體中的整型資料會被解析為歸一化的浮點型別。
如果真的想傳輸整型的資料,那麼需要使用_integer字尾。
type定義了每乙個成分所占用的位元組數。有兩種表示方式,一種是定義單一成分占用多少位元組,另一種是定義所有成分占用總的位元組數。
第一種方式
示例:
format type
gl_rgba gl_unsigned_byte
表示資料是顏色資料、成分是r\g
\b\a,每個成分占用1個位元組(8位)
其他可用的列舉包括
type列舉值
占用的位元組
gl_(unsigned_)byte
1位元組gl_(unsigned_)short
2位元組gl_(unsigned_)int
4位元組gl_half_float
2位元組gl_float
4位元組
第二種方式
格式如下,將所有成分打包在一起:
gl_[base type]_[size1]_[size2]_[size3]_[size4](_rev)
例如:
gl_unsigned_short_5_6_5 (gl_unsigned_short的大小必須容納下後面的5+6+5 = 16位)
_rev是可選的,如果定義了,那麼解析的方向按format中定義的方式反向解析。
定義了format是gl_rgb,同時定義type是gl_unsigned_short_5_6_5_rev,那麼在解析的時候等同於
定義format是gl_bgr type是gl_unsigned_short_5_6_5
通過format和type定義了單一畫素的資料格式,畫素傳輸的是一整塊的資料,因此資料的布局也非常重要,opengl通過glpixelstore定義了資料的布局格式,詳細的內容可以參考另一篇文章的描述。opengl api 之 glpixelstore(2)
畫素格式在傳輸中客戶端(cpu記憶體中)的資料和opengl影象(紋理和幀緩衝區)中的資料必須保持一致。
一般來說客戶端的資料可以是浮點型別(包含歸一化的整型)或者整型。在客戶端指定資料型別時,如果format指定的是_integer,但是type指定的是浮點型別的值(如gl_float,gl_half_float),那麼就會出現錯誤。同樣如果客戶端format指定的是_interger,但是gpu端的影象格式指定的不是整型,那麼傳輸也會失敗。一般來說最好將兩者指定的相容,省去轉換的麻煩。
參考文獻: pixel transfer
OpenGL畫素預設畫素儲存格式
opengl的畫素儲存格式是有glpixedstore來設定的,預設情況下相鄰兩行的儲存的位置是相差4的整數倍,也就是一行的儲存要用4的整數倍的位元組,不夠的情況下要補充。舉例說明 255,0,0 255,0,0 255,0,0 255,0,0 這裡 255,0,0 表示三個連續的byte,表示乙個...
OpenGL畫素操作
簡單的opengl畫素操作 opengl提供了簡潔的函式來操作畫素 glreadpixels 讀取一些畫素。當前可以簡單理解為 把已經繪製好的畫素 它可能已經被儲存到顯示卡的視訊記憶體中 讀取到記憶體 gldrawpixels 繪製一些畫素。當前可以簡單理解為 把記憶體中一些資料作為畫素資料,進行繪...
openGL第四講 畫素格式管理
opengl基礎技術講座 畫素格式管理 1 windows下的調色盤 opengl可以使用16色 256色 64k和16m真彩色。真彩模式下不需要調色盤,而在16色模式下根本不可能得到較為滿意的效果,因此對opengl而言,調色盤只有在256色模式下才有意義。我們知道,windows把調色盤分為系統...