发信人: rhine (有雨无风), 信区: BorlandDev
标 题: OpenGL在C++Builder中的应用(3)
发信站: 哈工大紫丁香 (Sun Aug 27 06:39:16 2000), 转信
发信人: jinchao (Sonic), 信区: BCB
发信站: BBS 水木清华站 (Fri Jul 30 09:01:44 1999) WWW-POST
(三) OpenGL的初始化
从这一节开始,我开始结合上一节的例子介绍OpenGL 编程的基本概念。
OpenGL的初始化一般是在FormCreate()函数中完成的,如果你以前开发过Win32下窗
口图形程序,一定记得设备描述表HDC,同样在OpenGL下也有类似的图形操作描述表
(Rendering Context),它包含有OpenGL与窗口系统相关的各种信息,一个OpenGL程序必
须先创建它才能启动整个程序,创建图形操作描述表首先要定义象素格式,象素格式描述
如下:
typedef struct tagPIXELFORMATDESCRIPTOR
{
WORD nSize; //结构大小
WORD nVersion; //版本
DWORD dwFlags; //象素缓冲的位标志
BYTE iPixelType; //RGBA模式或颜色索引模式
BYTE cColorBits; //颜色位数
BYTE cRedBits; //RGBA模式下R所占位数
BYTE cRedShift; //RGBA模式下R位数偏移
BYTE cGreenBits; //RGBA模式下G所占位数
BYTE cGreenShift; //RGBA模式下G位数偏移
BYTE cBlueBits; //RGBA模式下B所占位数
BYTE cBlueShift; //RGBA模式下B位数偏移
BYTE cAlphaBits; //RGBA模式下Alpha所占位数
BYTE cAlphaShift; //RGBA模式下Alpha位数偏移
BYTE cAccumBits; //累计缓冲区位面总数
BYTE cAccumRedBits; //累计缓冲区R位面总数
BYTE cAccumGreenBits; //累计缓冲区G位面总数
BYTE cAccumBlueBits; //累计缓冲区B位面总数
BYTE cAccumAlphaBits; //累计缓冲区Alpaha位面总数
BYTE cDepthBits; //深度缓冲位数
BYTE cStencilBits; //模版缓冲位数
BYTE cAuxBuffers; //Win32 下不支持
BYTE iLayerType; //不再使用
BYTE bReserved; //0
DWORD dwLayerMask; //不再使用
DWORD dwVisibleMask; //0
DWORD dwDamageMask; //不再使用
} PIXELFORMATDESCRIPTOR;
我知道有的朋友被这个庞大的结构吓倒了,其实这个结构大多数初始值是固定的,
对这个结构初始化后要让OpenGL选择最佳的象素模式,然后再设置为该象素模式,这两个
步骤是由ChoosePixelFormat()和SetPixelFormat()来完成的。设置完象素格式后再用
wglCreateContext()创建绘图操作描述表,这几步如下:
HDC hDC=GetDC(this->Handle);
int pixelFormat;
if((pixelFormat=ChoosePixelFormat(hDC,&pfd))==0)
{
MessageBox(NULL,"ChoosePixelFormat Error!","Error",MB_OK);
return;
}
if(SetPixelFormat(hDC,pixelFormat,&pfd)==false)
{
MessageBox(NULL,"SetPixelFormat Error!","Error",MB_OK);
return ;
}
初始化的最后几步是定义清屏色,在这里我先介绍一下OpenGL中的色彩表示,在
OpenGL中有两种色彩表示方法:RGBA模式和索引模式,在RGBA模式下,每种色彩都有
Red,Green,Blue,Alpha四个分量,其中Alpha分量主要用于图象的融合和深度控制,一般
置为0,在索引模式下每种颜色对应一个索引号,系统有一张总的颜色索引表,该表保存
每一个索引号和与之对应的颜色的R,G,B,A值,由于OpenGL对索引模式有许多限制,用
的较少,这里重点介绍RGBA模式。
为了适应不同硬件,OpenGL用浮点数表示RGBA各分量,取值范围从0.0到1.0,例如
(1.0, 0.0, 0.0, 0.0)表示纯红色,函数glClearColor()定义当前清屏色,上例中定义黑
色为当前清屏色,glClear()做具体清屏工作,其原形为:
void glClear(GLbitfield mask),其中mask为所清缓冲区的类型,取值为:
GL_COLOR_BUFFER_BIT 颜色缓冲区
GL_DEPTH_BUFFER_BIT 深度缓冲区
GL_ACCUM_BUFFER_BIT 模板缓冲区
GL_STENCIL_BUFFER_BIT 积累缓冲区
函数glShadeModel(GL_SMOOTH);定义着色方式为Ground方式,Ground着色方式可使
多边形的填充颜色产生层次或连续以改善其外观,上例中矩形中色彩的细腻过度便是该模
式的体现,如果改为glShadeModel(GL_FLAT);则矩形会变成一种颜色。上例中的初始化是
OpenGL最简单的一种,也是较为基础的一种,下面的程序都是以该例为基础的,请重视该
程序。
--
念天地之悠悠,
独沧然而泪下,
知我者谓我心忧,
不知我者谓我何求......
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: rhine.bbs@smth.org]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.095毫秒