发信人: 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毫秒