一、OpenGL数据类型
与C语言相对应,OpenGL中也有整数、字节、浮点数等数据类型,为了说明两者的对应关系,下表将OpenGL的数据类型与相应的C类型进行了对比:
前缀 | 数据类型 | 相应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 |
表一、OpenGL数据类型表
二、OpenGL库函数的命名规律
所有OpenGL函数采用了以下格式:
<库前缀><根命令><可选的参数个数><可选的参数类型>
库前缀有gl、glu、aux、glut、wgl、glx等等,分别表示该函数属于OpenGL某开发库等,从函数名后面中还可以看出需要多少个参数以及参数的类型。i代表int型,f代表float型,d代表double型,u代表无符号整型。注意,有的函数参数类型后缀前带有数字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[0]);
除了以上基本命名方式外,还有一种带"*"星号的表示方法,例如glColor*(),它表示可以用函数的各种方式来设置当前颜色。同理,glVertex*v()表示用一个指针指向所有类型的向量来定义一系列顶点坐标值。
任何复杂的三维模型都是由基本的几何图元:点、线段和多边形组成的,有了这些图元,就可以建立比较复杂的模型。因此这部分内容是学习OpenGL编程的基础。
三、基本图元的描述及定义
OpenGL图元是抽象的几何概念,不是真实世界中的物体,因此须用相关的数学模型来描述。所有的图元都是由一系列有顺序的顶点集合来描述的。OpenGL中绘制几何图元,必须使用glBegin()和glEnd()这一对函数,传递给glBegin()函数的参数唯一确定了要绘制何种几何图元,同时,在该函数对中给出了几何图元的定义,函数glEnd()标志顶点列表的结束。例如,下面的代码绘制了一个多边形:
glBegin(GL_POLYGON); |
函数glBegin(GLenummode)标志描述一个几何图元的顶点列表的开始,其参数mode表示几何图元的描述类型,具体类型见表一:
类型 | 说明 |
GL_POINTS | 单个顶点集 |
GL_LINES | 多组双顶点线段 |
GL_POLYGON | 单个简单填充凸多边形 |
GL_TRAINGLES | 多组独立填充三角形 |
GL_QUADS | 多组独立填充四边形 |
GL_LINE_STRIP | 不闭合折线 |
GL_LINE_LOOP | 闭合折线 |
GL_TRAINGLE_STRIP | 线型连续填充三角形串 |
GL_TRAINGLE_FAN | 扇形连续填充三角形串 |
GL_QUAD_STRIP | 连续填充四边形串 |
表二、几何图元类型说明
在glBegin()和glEnd()之间最重要的信息就是由函数glVertex*()定义的顶点,必要时也可为每个顶点指定颜色(只对当前点或后续点有效)、法向、纹理坐标或其他,即调用相关的函数:
任何复杂的三维模型都是由基本的几何图元:点、线段和多边形组成的,有了这些图元,就可以建立比较复杂的模型。
三、多边形(Polygon)
凸、凹多边形。
OpenGL定义的多边形是由一系列线段依次连结而成的封闭区域,多边形可以是平面多边形,即所有顶点在一个平面上,也可以是空间多边形。OpenGL规定多边形中的线段不能交叉,区域内不能有空洞,也即多边形必须是凸多边形(指多边形任意非相邻的两点的连线位于多边形的内部),不能是凹多边形,否则不能被OpenGL函数接受。凸多边形和凹多边形见图。
四、程序参数说明
1. #include <gl/glut.h> //header file for GLUT
2.voidmain(int argc, char **argv);
变量argc包含了传递到程序的参数的数目,argv是一个指向参数的指针。系统将它们传给glutInit(),让其能够处理发送到GLUT的任何命令行参数。
3.glutInitDisplayMode
该函数用来设置显示模式。可以用以下的参数来调用它:
- GLUT_RGB 指明要在窗口中使用一个RGB颜色缓存区。
- GLUT_DOUBLE 指明要一个双缓冲区。双缓冲区使得在图像被送到屏幕前完成绘制,从而防止闪烁。
- GLUT_DEPTH 指明要一个深度缓冲区。深度缓冲区确保靠近camera的物体永远在较远的物体上面。当只绘制单个的三角形的时候,这就没有必要。
- 4 glutCreateWindow()函数创建供绘制的窗口。
- 5. glutDisplayFunc() 回调函数diaplay的注册函数,绘制屏幕的函数, GLUT在显示需要更新的时候调用这个函数。
6.glutMainLoop()函数是GLUT框架中的主循环函数,
7. glClear()将清空窗口的颜色和深度缓冲区。需要在绘制之前做这个工作。
8.在glBegin()和glEnd()之间,需要用glVertex3f指定4个顶点。在每个glVertex2i()调用中的2个值是顶点在世界空间中的X,Y和Z=0坐标。
其实: intmain(int argc,char *argv[]) 是 UNIX 和 Linux 中的标准写法,而 int main() 只是 UNIX 及 Linux 默许的用法..
理解 voidmain(int argc, char** argv)
这个函数搞个两星号,看上去就复杂了点儿,如果改成这样就感觉熟悉的了许多voidmain(int argc, char* argv[ ])
void main(int argc, char* argv[ ])等同于void main(int argc, char* *argv)
这行中有三个字符串分别为 cp.exedoc1.txt doc2.txt
则argc为3,即argc是命令行中参数的个数。
char *argv[]为一个指像字符串的数组。
argv[0]="cp.exe"
argv[1]="doc1.txt"
argv[2]="doc2.txt"
agv[0]为一个字符串指针,它就象*p=”goodbye” 实际上是*argv[0]=”cp.exe”
p为goodbye的首地址,*p则指向goodbye的第一个字符,*p=”goodbye”与p[]=”goodbye”完全一致的作用, 同理argv[0]就指向cp.exe的地址,*argv[0]指向cp.exe的第一个字符,即c
argc,argv[] 的作用:
下面看个例子test_argc.c
文件名:test_argc.c
#include<unistd.h>
#include<stdio.h>
int main(int argc,char *argv[])
{
if( argc==1 || argc>2 )
{
printf("请输入想要编辑的文件名如:./test_argc filename \n");
}
if( argc==2 )
{
printf("编辑%s\n",argv[1]);
}
exit (0);
}
编译该程序:gcc -otest_argc test_argc.c
运行:#./test_argc
结果: 请输入想要编辑的文件名如:./test_argcfille
运行:#./test_argc test_argc.txt
结果: 编辑 test_argc.txt
看到这里 argc,argv[]如何用就很明白了,argc 是外部命令参数的个数,argv[] 存放各参数的内容,如上例:执行 ./test_argc 时,argc 为1,
argv[0] 为./test_argc .而执行./test_argc test_argc.txt 时,argc 的值为 2,
argv[0] 为./test_argc, argv[1] 为test_argc.txt .