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第四讲——像素格式管理相关推荐

  1. OpenGL第四讲——颜色模式

    Chapter4 颜色模式 无论哪种颜色模式,计算机都必须为每一个像素保存一些数据.不同的是,RGBA模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表的是一个索引,要得到真正的颜色,还必须去查 ...

  2. opengl像素格式和RC管理

    http://hi.baidu.com/dem_simulation/item/7e45bc4086bb59a461d7b9c6 1.写在前面 由于OpenGL被设计成独立于硬件,独立于窗口系统,因此 ...

  3. 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★

    文章目录 一.导入 OpenGL 的两个头文件 二.链接 OpenGL 库 三.将 Windows 桌面窗口改成 OpenGL 窗口 四.获取窗口设备 五.设置像素格式描述符 六.设置像素格式 七.创 ...

  4. 判断字符串格式_Python基础教程,第四讲,字符串详解

    本节课主要和大家一起学习一下Python中的字符串操作,对字符串的操作在开发工作中的使用频率比较高,所以单独作为一课来讲. 学完此次课程,我能做什么? 学完本次课程后,我们将学会如何创建字符串,以及如 ...

  5. 【slam十四讲第二版】【课本例题代码向】【第九讲~后端Ⅰ】【安装Meshlab】【BAL数据集格式】【ceres求解BA】【g2o求解BA】

    [slam十四讲第二版][课本例题代码向][第九讲~后端Ⅰ][安装Meshlab][BAL数据集格式][ceres求解BA][g2o求解BA] 0 前言 1 安装Meshlab: 三维几何网格处理 2 ...

  6. slam十四讲,第五讲中相机坐标系,像素平面坐标系,世界坐标系,归一化坐标系总结

    #笔记,方便日后忘记回看,仅总结,具体推导回看十四讲 先上图: 如图,现实世界中有一个P点和一个相机(光心),描述这个P点的空间坐标首先得有一个坐标系,那么以光心为原点O建一个坐标系,叫相机坐标系. ...

  7. 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 ...

  8. OpenGL像素格式

    1.简介 前文中描述了OpenGL的图像格式,本文接着描述像素格式 图像格式可以理解为对GPU中数据的解释,那么对于CPU端(也就是内存中)的数据解释就是像素格式的内容. 像素数据一般会在CPU和GP ...

  9. 视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

最新文章

  1. jar包名冲突gradle_jar包又冲突了?如何快速确定与哪个jar包冲突?
  2. android端与服务端差别,Android客户端和服务器端编程
  3. 蓝桥杯——黑色星期五
  4. 进程缓存和缓存服务,如何抉择?
  5. Linux/UNIX系统编程手册(英文版)pdf
  6. mysql确定数据表中是否存在某字段_MySQL判断表是否存在某个列
  7. Fiddler中文乱码设置
  8. 李航老师《统计学习方法》及相关资源(代码、课件)的汇总及下载
  9. Excel - 单元格设置斜线 并 添加文字
  10. 内存映射图( 网络IO和磁盘IO详解)
  11. JVM_0.5_小故事
  12. DevJoy 展商大名单+活动剧透!逛开发者游园会,体验沉浸式打 Bug!
  13. centos7 安装docker-ce社区版 ,最新版本docker,docker阿里云加速
  14. Android TextView自动调整字体大小(官方)
  15. Umijs 的安装部署及快速入门
  16. Java(老白再次入门) - 语言基础
  17. Mock测试工具比较
  18. 深圳自建房能申请学位吗 自建房申请学位需要哪些材料
  19. 2021国科大模式识别与机器学习期末考试试题
  20. 1300 · 巴什博弈

热门文章

  1. 守护线程与非守护线程的区别
  2. 洛谷 P2616 [USACO10JAN]购买饲料II Buying Feed, II
  3. ASIHTTPRequest的环境配置和使用示例
  4. android 代码混淆示例
  5. 协议森林08 不放弃 (TCP协议与流通信)
  6. 【转】Linux入门命令篇(简训)
  7. 一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
  8. 比较有用的sql语句
  9. 达拉草201771010105《面向对象程序设计(java)》第十六周学习总结
  10. Python3 turtle教程