openGL第四讲——像素格式管理
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
{
WORD nSize;
WORD nVersion;
DWORD dwFlags;
BYTE iPixelType;
BYTE cColorBits;
BYTE cRedBits;
BYTE cRedShift;
BYTE cGreenBits;
BYTE cGreenShift;
BYTE cBlueBits;
BYTE cBlueShift;
BYTE cAlphaBits;
BYTE cAlphaShift;
BYTE cAccumBits;
BYTE cAccumRedBits;
BYTE cAccumGreenBits;
BYTE cAccumBlueBits;
BYTE cAccumAlphaBits;
BYTE cDepthBits;
BYTE cStencilBits;
BYTE cAuxBuffers;
BYTE iLayerType;
BYTE bReserved;
DWORD dwLayerMask;
DWORD dwVisibleMask;
DWORD dwDamageMask;
} 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 設置像素格式的一般步驟
?轉載于:https://www.cnblogs.com/cpx3216/archive/2008/12/01/1938122.html
總結
以上是生活随笔為你收集整理的openGL第四讲——像素格式管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让列表只显示数据,不显示文件夹的方法
- 下一篇: C# 总结 进度表