您的位置:首页 > 运维架构

opengl基础知识

2013-04-02 19:48 246 查看
一、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);

glVertex2f(0.0,0.0);

glVertex2f(0.0,3.0);

glVertex2f(3.0,3.0);

glVertex2f(4.0,1.5);

glVertex2f(3.0,0.0);

glEnd();




  函数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 .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: