国学参考      
首页 | 地理资讯 | 地理文摘 | 环境气象 | 学习园地 | 地理百科 | 地域行政 | 地理资源 | geography | 专题 | 参考文库 | 参考论坛
  当前位置:首页>地理文摘>技术应用>文章内容
第四讲
来源: 作者:国学 发布时间:1969-12-31  








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消息,让它们设置逻辑调色板和重绘客户区,以便能更充分地利用系统调色板,已拥有键盘输入焦点的窗口不应再处理这条消息,以避免出现死循环。 zgwwW
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种系统颜色纳入到逻辑调色板中。 zgwww.net
从原理上来说,并非一定要使用线性映射,还可以用其它一些映射关系,如加入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; zgwww.net
各变量的含义如下:
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模式时,蓝色组分偏移量。 zgwww.net
cAlphaBits:采用RGBA模式时,Alpha组分占用位数。
cAlphaShift:采用RGBA模式时,Alpha组分偏移量。
cAccumBits:指定累积缓冲区表示一个像素所用位数。
cAccumRedBits:指定累积缓冲区表示红色组分占用位数。
cAccumGreenBits:指定累积缓冲区表示绿色组分占用位数。
cAccumBlueBits:指定累积缓冲区表示蓝色组分占用位数。
cAccumAlphaBits:指定累积缓冲区表示Alpha组分占用位数。
cDepthBits:指定深度缓冲区表示一个像素所用位数。
cStencilBits:指定模板缓冲区表示一个像素所用位数。
cAuxBuffers:指定辅助缓冲区,Windows9x、NT不支持。
iLayerType:Windows9x、NT下只能是PFD_MAIN_PLANE。
共2页: 上一页 1 [2] 下一页
 
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·激光雷达技术
·3DGIS在城市规划中的应用
·机载激光雷达LiDAR技术介绍
·Mapbasic(中文)参考手册
·扬州市数字化城市管理系统
·令人震撼!!摄影师眼中的镜头[1
·激光雷达特点、分类及其发展
·国家坐标系
·常见遥感卫星基本参数大全
·ArcGIS
·GIS在交通行业的应用
·VirtuoZo全数字摄影测量系统数字
  相关文章
·第二讲
·第三讲
·第一讲
·城市仿真开发步骤大面积城区基础
·2002年ESRI全球用户大会综述
·城市仿真概述
·XX城市地下管线设施GIS综合信息
·MAPGIS中扫描矢量化及其相
·基础地理信息系统中图形数据库建
·GIS地图知识(1)
·城市煤气管网信息系统
·GIS地图知识(2)
Copyright © 2006 国学参考  All Rights Reserved Power by:HeadWind