发信人: rhine (有雨无风), 信区: BorlandDev
标  题: OpenGL在C++Builder中的应用(4)
发信站: 哈工大紫丁香 (Sun Aug 27 06:40:20 2000), 转信

发信人: jinchao (Sonic), 信区: BCB
发信站: BBS 水木清华站 (Fri Jul 30 09:03:54 1999) WWW-POST

              (四)基本图形绘制
     OpenGL在初始化后便可以进行绘图了,OpenGL的绘图方式与传统的绘图有概念上的
不同,下面是第一个例子中的DrawWithOpenGL()函数,它完成一个矩形的绘制:
void TForm1::DrawWithOpenGL()
{
    HDC hDC;
    glClearColor(0.0f,0.0f,0.0f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_QUADS);
      glColor3f(1.0f,1.0f,1.0f);glVertex3f(1.0f,1.0f,0.0f);
      glColor3f(1.0f,0.0f,0.0f);glVertex3f(2.0f,1.0f,0.0f);
      glColor3f(0.0f,1.0f,0.0f);glVertex3f(2.0f,2.0f,0.0f);
      glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,2.0f,0.0f);
    glEnd();

    glFlush();
    hDC = wglGetCurrentDC();
    SwapBuffers(hDC);
}
    在完成清屏工作后,函数glBegin(GL_QUADS)和glEnd()之间是矩形的绘制过程,然后
调用glFlush();强制完成绘图工作,SwapBuffers();函数是用于完成两个图形缓冲区的交
换,这是由于在定义象素格式时,缓冲区特征标志中有PFD_DOUBLEBUFFER一项,使用双缓
冲区可以避免在绘制过程中出现闪烁。glBegin()函数的原形为void glBegin(GLenum 
mode);其中mode表示图元的类型,取值如下:

GL_POINTS         一系列独立的点                
GL_LINES          每两点构成一条线段
GL_POLYGON        简单的凸多边形
GL_TRIANGLES      每三点连成一个三角形
GL_QUADS          每四点连成一个四边形
GL_LINE_STRIP     顶点相连,成为一系列线段
GL_LINE_LOOP      顶点相连,成为一系列线段,最后一点与第一点相连
GL_TRIANGLE_STRIP       相连的三角形带
GL_TRINGLE_FAN  相连的三角形扇形
GL_QUAD_STRIP   相连的四边形带

      所有的图元都是在glBegin()和glEnd()之间用关键点定义的,例如上例中矩形依次
用glVertex3f()定义其四个顶点,glColor3f()是用来定义"当前色彩",当一个点被定义
时其色彩即为"当前色彩",在OpenGL中,"当前值"是个很重要的概念,很多变量都是"状
态值",只要定义一次,在下一次定义之前是不会改变的,例如上节介绍的绘图设备描述
表,清屏色,以及当前色彩等值都是状态值。
    函数glColor3f()原形为  
       void glColor3{bsifd ub us ui}(TYPE r,TYPE g,TYPE b);
      void glColor4{bsifd ub us ui}(TYPE r,TYPE g,TYPE b,TYPE a);
      void glColor{34}{bsifd ub us ui}v(TYPE *v);
      这类函数有3和4两种方式,大括号中为参数的类型,如下:


   b   单字节          s        双字节
   i   四字节          f        浮点数,取值范围为[0.0,1.0]
   d   双精度浮点数       ub    有符号单字节
   us 无符号双字节        ui    无符号四字节

    例如函数   glColor4us(r,g,b,a)表示r,g,b,a是无符号双字节整数,取值从0到
65535,函数glColor3fv(v)表示V 是一指向浮点数数组的指针,数组的内容依次为r,g,b
,在OpenGL中,很多函数都有这样的多重定义,例如glVertex3f()定义如下:

        void glVertex2{dfis}(TYPE x,TYPE y);
        void glVertex3{dfis}(TYPE x,TYPE y,TYPE z);
        void glVertex4{dfis}(TYPE X,TYPE Y,TYPE Z,TYPE w);
        void glVertex{234}{dfis}(const TYPE *v);
    
    在OpenGL中,坐标原点定义在窗口的左下角,X轴向右,Y轴向上,Z轴垂直屏幕指向
用户,这与Windows API 是不同的,后者的坐标原点在窗口的左上角,另外,OpenGL中点
的坐标除了x,y,z外还可有w,坐标(X,Y,Z,w),等同于(X/w,Y/w,Z/w),w的引入是为矩阵运
算方便而引入的,需注意的是,当w=0时点其实在无穷远处,此时点的坐标仅有方向上的
意义,这在定义无穷远处的光源时很有用处,关于OpenGL的坐标系是较为复杂的部分,以
后会专门介绍,

--
        念天地之悠悠,
        独沧然而泪下,
        知我者谓我心忧,
        不知我者谓我何求......

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: rhine.bbs@smth.org]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.573毫秒