OpenGL畫素格式

2021-07-25 13:26:04 字數 2594 閱讀 5206

前文中描述了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把調色盤分為系統...