openGL第四講 畫素格式管理

2022-09-04 10:00:12 字數 4368 閱讀 4340

opengl基礎技術講座--畫素格式管理

1、windows下的調色盤

opengl可以使用16色、256色、64k和16m真彩色。真彩模式下不需要調色盤,而在16色模式下根本不可能得到較為滿意的效果,因此對opengl而言,調色盤只有在256色模式下才有意義。

我們知道,windows把調色盤分為系統調色盤和邏輯調色盤。每個應用程式都擁有一套自己的邏輯調色盤(或使用預設調色盤),當該應用程式擁有鍵盤輸入焦

點時可以最多使用從16m種色彩中選取的256種顏色(20種系統保留顏色和236種自由選取的顏色),而失去焦點的應用程式可能會有某些顏色顯示不正

常。系統調色盤由windows核心來管理,它是由系統保留的20種顏色和經仲裁後各個應用程式設定的顏色組成,並與硬體的256個調色盤相對應。應用程

序的邏輯調色盤與硬體的調色盤沒有直接的對應關係,而是按照最小誤差的原則對映到系統調色盤中,因此即使應用程式自由選取256種不同顏色構成自己的邏輯

調色盤,也有可能某些顏色顯示到螢幕上時是一樣的。

當應用程式的視窗接收到鍵盤輸入焦點時,windows會向它傳送一條

wm_querynewpalette訊息,讓它設定自己的邏輯調色盤,此時windows會在系統調色盤中盡量多地加入該應用程式需要的顏色,並生成相

應的對映關係。接著windows會向系統中所有的覆蓋型視窗和頂級視窗(包括擁有鍵盤輸入焦點的視窗)傳送一條wm_palettechanged消

息,讓它們設定邏輯調色盤和重繪客戶區,以便能更充分地利用系統調色盤,已擁有鍵盤輸入焦點的視窗不應再處理這條訊息,以避免出現死迴圈。

2、opengl的顏色表示與轉換

opengl

內部用浮點數來表示和處理顏色,紅綠藍和alpha值這四種成份每種的最大值為1.0,最小值為0.0。在256色模式下,opengl把乙個畫素顏色的

內部值按線性關係轉換為8位元(bit)來輸出到螢幕上,其中紅色佔最低位的3位元,綠色佔中間的3位元,藍色佔最高位的2位元,windows將這個8

位元值看作邏輯調色盤的索引值。例如opengl的顏色值(1.0,0.14,0.6667)經過轉換後二進位制值為10001111(紅色為111,綠色

為001,藍色為10),即第143號調色盤,該調色盤指定的顏色的rgb值應與(1.0,0.14,0.6667)有相同的比率,為(255,36,

170),如果不是該值,那麼顯示出來的顏色就會有誤差。

3、調色盤的生成演算法

很明顯,opengl輸出的8位元值中直接表明了顏色的組

成,為了使圖形顯示正常,我們應以線性關係來設定邏輯調色盤,使其索引值直接表明顏色的組成。因此生成調色盤時,把索引值從低位到高位分成3-3-2共三

個部分,將每一部分對映到0-255中去,這樣3位元對映為{0,36,73,109,146,182,219,255},2位元對映為{0,85,

170,255},最後把三部分組合起來成為一種顏色。

經過上面的處理後,256種顏色均勻分布在顏色空間中,並沒有完全包含系統保留的20種顏色(只包含了7種),這意味著將會有數種顏色顯示成一樣,從而影響效果。乙個較好的解決辦法是按照最小均方誤差的原則把13種系統顏色納入到邏輯調色盤中。

從原理上來說,並非一定要使用線性對映,還可以用其它一些對映關係,如加入gamma校正以便更能符合人眼的視覺特性,不過這些對映關係應用得並不廣泛,在此不再討論。

1.3.4 畫素格式設定

畫素格式是opengl視窗的重要屬性,它包括是否使用雙緩衝,顏色位數和型別以及深度位數等。畫素格式可由windows系統定義的所謂畫素格式描述子結構來定義(pixelformatdescriptor),該結構定義在windows.h中。

在該結構中包含有26個屬性資訊,其形式為:

typedef struct tagpixelformatdescriptor

pixelformatdescriptor;

各變數的含義如下:

nsize:該結構所佔記憶體空間。

nversion:版本號,當前為1。

dwflags:指定畫素格式屬性,可選參量如表1.1所示。

表1.1 畫素格式屬性

識別符號 解釋

pfd_draw_to_bitmap 支援記憶體中繪製位圖

pfd_draw_to_window 支援螢幕繪圖

pfd_doublebuffer 支援雙緩衝

pfd_ceneric_format 指定選擇gdi支援的畫素格式

pfd_need_palette 指定需要邏輯調色盤

pfd_need_system_palette 指定需要硬體調色盤

pfd_stereo nt不支援

pfd_support_opengl 支援opengl

pfd_support_gdi 支援gdi,此時不可使用pfd_doublebuffer

ipixeltype:畫素顏色模式,可選項為pfd_type_rgba或pfd_type_index,分別對應於rgba模式和顏色索引模式。

ccolorbits:指定顏色的位數。

credbits:採用rgba模式時,紅色組分占用位數。

credshift:採用rgba模式時,紅色組分偏移量。

cgreenbits:採用rgba模式時,綠色組分占用位數。

cgreenshift:採用rgba模式時,綠色組分偏移量。

cbluebits:採用rgba模式時,藍色組分占用位數。

cblueshift: 採用rgba模式時,藍色組分偏移量。

calphabits:採用rgba模式時,alpha組分占用位數。

calphashift:採用rgba模式時,alpha組分偏移量。

caccumbits:指定累積緩衝區表示乙個畫素所用位數。

caccumredbits:指定累積緩衝區表示紅色組分占用位數。

caccumgreenbits:指定累積緩衝區表示綠色組分占用位數。

caccumbluebits:指定累積緩衝區表示藍色組分占用位數。

caccumalphabits:指定累積緩衝區表示alpha組分占用位數。

cdepthbits:指定深度緩衝區表示乙個畫素所用位數。

cstencilbits:指定模板緩衝區表示乙個畫素所用位數。

cauxbuffers:指定輔助緩衝區,windows9x、nt不支援。

ilayertype:windows9x、nt下只能是pfd_main_plane。

breserved:=0。

dwlayermask:指定覆蓋層的遮蔽,windows9x、nt不支援。

dwvisiblemask:windows9x、nt不支援。

dwdamagemask:windows9x、nt不支援。

windows提供了四個畫素格式管理函式,分別介紹如下:

(1) int choosepixelformat(hdc hdc,

pixelformatdescriptor *ppdf)

該函式比較傳過來的畫素格式描述和opengl支援的畫素格式,返回乙個最佳匹配的畫素格式索引。該索引值可傳給setpixelformat為dc設定畫素格式。返回值為0表示失敗。

在比較畫素格式時,匹配優先順序順序為畫素格式描述子結構中的下述各域:

dwflags->ccolorbits->calphabits->caccumbits

->cdepthbits->cstencilbits->cauxbuffers->ilayertype

硬體支援的畫素格式優先。

(2) int describepixelformat(hdc hdc, int ipixelformat, uint nbytes,

lppixelformatdescriptor *ppfd)

該函式用格式索引ipixelformat說明的畫素格式來填寫由ppfd所指向的畫素格式描述子結構,利用該函式可以列舉畫素格式。

(3) int getpixelformat(hdc hdc)

該函式用於獲取hdc的格式索引。

(4) bool setpixelformat(hdc hdc, int ipixelformat,

lppixelformatdescriptor *ppfd)

該函式用格式索引ipixelformat來設定hdc的畫素格式。在使用該函式之前應該呼叫choosepixelformat來獲取畫素格式索引。另

外,opengl視窗風格必須包含ws_clipchildren和ws_clipsiblings型別,否則設定失敗。

應該注意的是

choosepixelformat函式並不一定返回乙個最佳的畫素格式值,可以利用describepixelformat來列舉系統所支援的所有畫素

格式。opengl的通常支援24種不同的畫素格式,如果系統安裝了opengl硬體加速器,它可能會支援其它的畫素格式。

設定dc的畫素格式的步驟如圖1.5所示。

圖1.5 設定畫素格式的一般步驟

OC第四講記憶體管理

第一題 定義兩個類,借用retaincount和dealloc方法測試以下記憶體管理方法 alloc retain copy release autorelease。記憶體管理的方式分為 mrc 手動 和arc 自動 使用alloc retain copy引用計數 retaincount 加一 使用...

視覺SLAM十四講第四講

主要目標 理解李群與李代數的概念,掌握 so 3 se 3 與對應李代數的表示方式。理解 bch 近似的意義。學會在李代數上的擾動模型。使用 sophus 對李代數進行運算。旋轉矩陣自身是帶有約束的 正交且行列式為 1 它們作為優化變數時,會引入額外的約束,使優化變得困難。通過李群 李代數間的轉換關...

第四講 Xpath語法

一 什麼是 xml 二 xml 和 html 的區別 名詞解釋 與html對應,需要自己命名,標籤嚴格閉合 即上下對應 三 xml的節點關係 參考html的節點關係 xpath xml path language 是一門在 xml 文件中查詢資訊的語言,可用來在 xml 文件中對元素和屬性進行遍歷。...