hyde
路人甲
路人甲
  • 注册日期2003-09-24
  • 发帖数555
  • QQ
  • 铜币1457枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1258回复:0

OpenGL系列讲座(4)

楼主#
更多 发布于:2004-03-20 10:27
第二部分  基础篇
 

第一章 OpenGL 基本程序结构
 

用OpenGL编写的程序结构类似于用其他语言编写的程序。实际上,OpenGL是一个丰富

的三维图形函数库,编写OpenGL程序并非难事,只需在基本C语言中调用这些函数,用法同

Turbo C、Microsoft C等类似,但也有许多不同之处。

本书所有的程序都是在Windows NT的Microsoft Visual C++ 2.0 集成环境下编译连接

的,其中有部分头文件和函数是为这个环境所用的,如头文件"glos.h"。此外,为便于各类

读者同时快速入门,在短时间内掌握OpenGL编程的基本方法和技巧,书中例子尽量采用标准

ANSI C调用OpenGL函数来编写,而且所有例程都只采用OpenGL附带的辅助库中的窗口系统。

此外,这样也便于程序在各平台间移植,尤其往工作站UNIX操作系统移植时,也只需改动头

文件等很少很少的部分。

 

    下面列出一个简单的OpenGL程序simple.c:

 

例 2-1  OpenGL简单例程 simple.c

 

    #include <GL/gl.h>

    #include <GL/glaux.h>

    #include "glos.h"

 

    void main(void)

    {

     auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);

     auxInitPosition(0,0,500,500);

     auxInitWindow("simple");

 

     glClearColor(0.0,0.0,0.0,0.0);

     glClear(GL_COLOR_BUFFER_BIT);

 

     glColor3f(1.0,0.0,0.0);

     glRectf(-0.5,-0.5,0.5,0.5);

 

     glFlush();

     _sleep(1000);

 

    }

 

 

    这个程序运行结果是在屏幕窗口内画一个红色的方块。下面具体分析整个程序结构:

首先,在程序最开始处是OpenGL头文件:<GL/gl.h>、<GL/glaux.h>。前一个是gl库的

头文件,后一个是辅助库的头文件。此外,在以后的几章中还将说明OpenGL的另外两个头文

件,一个是<GL/glu.h>实用库的头文件,另一个是<GL/glx.h>X窗口扩充库的头文件(这个

常用在工作站上)。接下来是主函数main()的定义:

    一般的程序结构是先定义一个窗口,

 

     auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);

     auxInitPosition(0,0,500,500);

     auxInitWindow("simple");

 

auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)设置窗口显示模式为RGBA方式,即彩色方

式,并且图形缓存为单缓存(SINGLE BUFFER)。auxInitPosition(0,0,500,500)定义窗口的

初始位置,前两个参数(0,0)为窗口的左上角点的屏幕坐标,后两个参数(500,500)为窗口的

宽度和高度。auxInitWindow("simple")是窗口初始化,字符参数是窗口名称。

 

    然后是窗口内清屏,

 

     glClearColor(0.0,0.0,0.0,0.0);

     glClear(GL_COLOR_BUFFER_BIT);

 

第一句将窗口清为黑色,第二句将颜色缓冲区清为glClearColor(0.0,0.0,0.0,0.0)命

令所设置的颜色,即同窗口背景颜色一致。

 

    再接着是在窗口内画一个物体,

 

     glColor3f(1.0,0.0,0.0);

     glRectf(-0.5,-0.5,0.5,0.5);

 

很明显,第一句设置物体颜色,函数中前三个参数分别为R、G、B值,最后一个参数是

Alpha值,范围都从0至1;第二句绘制一个二维矩形。

注意,OpenGL是针对三维图形而言,因此用作OpenGL编程绘制物体必须意识到任何一

个物体都是三维的,具有空间性,而显示于屏幕上的物体都是三维物体在二维平面上的投影。

从表面上看,上述程序代码很简单,实际上已经用到了缺省的投影形式(正射投影)。

    再看glFlush()函数,表示强制绘图完成。

最后一句_sleep(1000),参数单位为毫秒,整句意思是保持现有状况一秒钟,然后结束

程序运行。这个函数是VC的库函数。

总之,OpenGL程序基本结构为定义窗口、清理窗口、绘制物体、结束运行
第二章  OpenGL数据类型和函数名
 

OpenGL的数据类型定义可以与其它语言一致,但建议在ANSI C下最好使用以下定义的

据类型,如GLint、GLfloat等。具体类型见表2-2-1.

______________________________________________________________________________

前缀     数据类型                相应C语言类型       OpenGL类型

______________________________________________________________________________

 

 b     8-bit integer              signed char        GLbyte

 s    16-bit integer              short              GLshort

 i    32-bit integer              long               GLint,GLsizei

 f    32-bit floating-point       float              GLfloat,GLclampf

 d    64-bit floating-point       double             GLdouble,GLclampd

 ub    8-bit unsigned integer     unsigned char      GLubyte,GLboolean

 us   16-bit unsigned integer     unsigned short     GLushort

 ui   32-bit unsigned integer     unsigned long      GLuint,GLenum,GLbitfield

______________________________________________________________________________

 

          表 2-2-1   命令前缀和参数数据类型

 

 

OpenGL的库函数命名方式很有规律,了解这种规律后阅读和编写程序都比较容易方便。

首先,每个库函数有前缀 gl、glu、glx或aux,表示此函数分属于基本库、实用库、X 窗口

扩充库或辅助库,其后的函数名头字母大写,后缀是参数类型的简写,取i、f,参见表2-1。

例:

 

       glVertex2i(2,4);

       glVertex3f(2.0,4.0,5.0);

 

注意,有的函数参数类型后缀前带有数字2、3、4。2代表二维,3代表三维,4代表alpha

值(以后详细介绍)。

有些OpenGL函数最后带一个字母v,表示函数参数可用一个指针指向一个向量(或数

组)来替代一系列单个参数值。下面两种格式都表示设置当前颜色为红色,二者等价。

 

       glColor3f(1.0,0.0,0.0);

 

       float color_array[]={1.0,0.0,0.0};

       glColor3fv(color_array);

 

除了以上基本命名方式外,还有一种带“*”星号的表示方法,如glColor*(),它表示

可以用函数的各种方式来设置当前颜色。同理,glVertex*v()表示用一个指针指向所有类型

的向量来定义一系列顶点坐标值。

最后,OpenGL也定义GLvoid类型,如果用C语言编写,可以用它替代void类型。

 

<img src="images/post/smile/dvbbs/em00.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
喜欢0 评分0
夜落了,风静了,我喜欢一本书,一杯茶,一粒摇曳的烛光...
游客

返回顶部