阅读:1343回复:0
OpenGL系列讲座(4)
第二部分 基础篇
第一章 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" /> |
|
|