计算机图形学OpenGL编程初步12 第二章OpenGL入门.docx
- 文档编号:5082851
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:10
- 大小:19.58KB
计算机图形学OpenGL编程初步12 第二章OpenGL入门.docx
《计算机图形学OpenGL编程初步12 第二章OpenGL入门.docx》由会员分享,可在线阅读,更多相关《计算机图形学OpenGL编程初步12 第二章OpenGL入门.docx(10页珍藏版)》请在冰豆网上搜索。
计算机图形学OpenGL编程初步12第二章OpenGL入门
OpenGL编程初步
OpenGL介绍
●由SGI公司的GL发展而来的一个工业标准图形库。
●OpenGL由图形库GL(GraphicsLibrary)和应用图形库GLU(GraphicsLibraryUtilities)两个库组成。
●OpenGL是与平台无关的标准图形库,可在多种平台上运行。
确切地说是与窗口系统无关。
●OpenGL可在网络上运行,显示图形的计算机可以不是运行图形程序的计算机。
●但OpenGL没有事件处理(如鼠标,键盘输入等)和窗口管理(如大小,位置等)的功能。
●另一个辅助库GLUT提供了与平台无关的事件处理和窗口管理功能。
●实现事件处理和窗口管理等功能的另一个方法是使用OpenGL在特定窗口系统的扩展,如OpenGL的X扩展GLX,在Windows的扩展WGL。
OpenGL的发展
●1992年7月,OpenGL1.0;
●1995年12月,OpenGL1.1;
●1998年3月,OpenGL1.2;
●1998年10月,OpenGL1.2.1;
●2001年8月,OpenGL1.3;
●2002年7月,OpenGL1.4.
●OpenGL由独立组织ARB(OpenGLArchitectureReviewBoard)管理。
成立于1992年。
主要成员有IBM,SGI,Intel,Microsoft,Compaq等。
●另一独立组织OPC(OpenGLPerformanceCharacterizationCommittee)负责管理和发布OpenGL的性能测试基准(benchmark)。
OpenGL与Windows平台
●Microsoft和SGI共同开发了OpenGL的WIN32版本,称为WGL。
最先OpenGL集成在WindowsNT中,后来集成到了Windows95(OSR2)中。
Windows98已将OpenGL作为标准组成部分。
●运行OpenGL程序,需要在windows\system目录下有动态连接库opengl32.dll,glu32.dll,使用GLUT的用戶需要有glut32.dll。
编译OpenGL程序需要有头文件gl.h和glu.h,库opengl32.lib,glu32.lib。
使用GLUT还需要头文件glut.h和库glut32.lib。
一个简单的OpenGL程序
●程序源代码
/*
*glut程序模板
*/
/*
*使用GLUT时,每个程序都需要的头文件
*glut.h自动包含gl.h,glu.h和其它的头文件
*/
#include
/*
*一些程序中使用的标准头文件
*/
/*
#include
#include
#include
*/
#definePI3.1415926535897932385
/*
*图形生成函数:
您必须写一个函数生成您的图形模型中的对象,
*您的程序并不显示地调用这一函数,OpenGL在适当的时候调用此函数。
*此处的函数清屏之后,
*使用当前颜色绘制一条从(-5.5,-5.5)到(5.5,5.5)的线段
*/
staticvoidMyDisplay(void)
{
/*
*设置glClear()清除后的窗口缓冲区颜色
*glClearColor()並未更新窗口缓冲区的颜色
*使用glClear()才真正更新窗口缓冲区颜色
*/
glClearColor(0.0,0.0,0.0,0.0);
/*
*在开始绘制新的对象以前,
*使用glClearColor()设置颜色以更新窗口缓冲区
*/
glClear(GL_COLOR_BUFFER_BIT);
/*
*设置当前的绘图颜色
*/
glColor3f(1.0,0.0,0.0);
/*
*开始划线
*这是一条从世界坐标(-5.5,-5.5)到(5.5,5.5)的线段
*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0,0.0,0.0);
glLineWidth(2.0);
glBegin(GL_LINES);
glVertex2f(-5.5,-5.5);
glVertex2f(5.5,5.5);
glEnd();
glColor3f(0.0,1.0,0.0);
glLineWidth(4.0);
glRotatef(30.,0,0,1);
glBegin(GL_LINES);
glVertex2f(-15.5,-5.5);
glVertex2f(5.5,5.5);
glEnd();
glColor3f(0.0,0.0,1.0);
glLineWidth(6.0);
glRotatef(30.,0,0,1);
glBegin(GL_LINES);
glVertex2f(-35.5,-5.5);
glVertex2f(5.5,5.5);
glEnd();
glLoadIdentity();
glColor3f(1.0,1.0,1.0);
glBegin(GL_POLYGON);
glVertex2i(5.0,5.0);
glVertex2i(15.0,5.0);
glVertex2i(15.0,15.0);
glVertex2i(5.0,15.0);
glEnd();
/*
*强制OpenGL命令的执行,并清空所有OpenGL的缓冲区。
*/
glFlush();
return;
}
/*
*初始化函数:
您必须写一个函数初始化OpenGL的状态变量和您自己的数据。
*这一函数在主函数main()中调用。
*习惯上将"standardinitialization"(glut...()调用放在主函数main()中
*而將其它的初始化放在这一函数中。
*/
staticvoidMyInit(void)
{
/*
*使用滤波反走样划线
*/
glEnable(GL_LINE_SMOOTH);
return;
}
/*
*窗口管理函数:
这是当前窗口改变尺寸时的回调函数。
*当窗口初次显示,窗口重叠后此函数也被击活。
*用于重新计算模型,取景变换及投影变换。
*/
staticvoidMyReshape(intwidth,intheight)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
#defineX_SIZE20
if(width<=height)
gluOrtho2D(-X_SIZE,
X_SIZE,
-X_SIZE*(GLfloat)height/(GLfloat)width,
X_SIZE*(GLfloat)height/(GLfloat)width);
else
gluOrtho2D(-X_SIZE*(GLfloat)width/(GLfloat)height,
X_SIZE*(GLfloat)width/(GLfloat)height,
-X_SIZE,
X_SIZE);
/*
glFrustum(-1.0,1.0,-1.0,1.0,5.0,25.0);
*/
//glTranslatef(0.0,0.0,-15.0);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
return;
}
/*
*空闲处理函数:
当没有窗口事件时调用的函数以进行一定的后台处理。
*在此函数中应避免大量的计算和绘制命令。
*/
staticvoidMyIdle(void)
{
/*
glutPostRedisplay();
*/
return;
}
intmain(intargc,char*argv[])
{
/*
*函数glutInit()初始化OpenGL状态机。
命令行的参数也传递给此函数,
*但参数的处理依赖于窗口系统
*/
glutInit(&argc,argv);
/*
*函数glutInitDisplayMode()初始化显示设备,
*其参数为位串,多个位串取或OR后为参数值。
*去除下面一行不会影响程序的运行,因为下面的参数是缺省值。
*/
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
/*
*设置窗口的尺寸
*/
glutInitWindowSize(400,400);
/*
*设置窗口初始位置:
窗口的左边界离屏幕的左边界100个象素,
*窗口的顶部左边离屏幕的顶部50个象素。
*/
glutInitWindowPosition(100,50);
/*
*使用上面的设置创建窗口,
*作为参数的字符串是将建立的窗口的标题。
*此时窗口并不出现,一直到执行glutMainLoop()时窗口才出现。
*/
glutCreateWindow("哇赛,MyfirstOpenGLprogram");
/*
*初始化函数:
按上面关于MyInit()的介绍,
*此处进行一些关于OpenGL的初始化。
*有些关于OpenGL的初始化,如glEnable(),
*必须在glutCreateWindow()后执行。
*/
MyInit();
/*
*注册回调函数──图形生成函数MyDisplay()。
*之后OpenGL知道调用那个函数显示您的图形模型中的对象。
*/
glutDisplayFunc(MyDisplay);
/*
*注册处理窗口状态改变时的回调函数──窗口管理函数MyReshape()。
*/
glutReshapeFunc(MyReshape);
/*
*注册处于空闲状态时的回调函数──空闲处理函数MyReshape()
*/
glutIdleFunc(MyIdle);
/*
*glutMainLoop()调用各个回调函数处理各种事件,
*直到用户终止程序,如通过关闭窗口。
*/
glutMainLoop();
return0;
}
OpenGL命名规范
●函数名以gl,glu,glut开始,其中每一成份的首写字母大写,如glPolygonMode();
●常数名以GL,GLU,GLUT开始,中间以下划线_分离,如GLUT_RGBA;
●OpenGL 核心命令集。
包括115个用于3D图形操作的库函数,其前缀为 gl。
如果考虑这些函数的参数类型的不同,这115个函数可生出300多个OpenGL命令。
●OpenGL实用库(OpengGL Utility Library,GLU),这些函数的功能更高一些,包括43个OpenGL实用函数,前缀为glu。
函数名的一般结构
[gl,glu,glut]
●[234]表示参数个数
●[sifd]表示参数类型
●[v]使用指针参数
OpenGL的数据类型
前缀
数据类型
典型的C类型
OpenGL类型
b
8-bitinteger
signedchar
GLbyte
s
16-bitinteger
short
GLshort
i
32-bitinteger
long
GLint,GLsizei
f
32-bitfloating-point
float
GLfloat,GLclampf
d
64-bitfloating-point
double
GLdouble,GLclampd
ub
8-bitunsignedinteger
unsignedchar
GLubyte,GLboolean
us
16-bitunsignedinteger
unsignedshort
GLushort
ui
32-bitunsignedinteger
unsignedlong
GLuint,GLenum,GLbitfield
OpenGL的图元
●OpenGL的图元有点,折线和多边形;
●折线由一系列相继的顶点定义;
●多边形由封闭的折线定义。
多边形的边不能交叉而且必须凸多边形。
●描述的多边形不满足这些要求,则调用GLU的函数进行详细描述和镶嵌。
●描述图元就是按次序给出图元的顶点坐标。
●使用
glVertex{234}{sifd}[v](TYPEcoords);
命令设定顶点坐标。
●例如
glVertex2s(2,3);
glVertex3d(0.0,0.0,3.188);
glVertex4f(2.3,1.0,-2.2,2.0);
GLdoubledvect[3]={5.0,9.0,1979.0};
glVertex3dv(dvect);
●调用glBegin()表示一个图元定义的开始;
●调用glEnd()表示一个图元定义的结束;
●glBegin()参数定义要构造的图元类型,其类型有GL_POINTS,GL_LINES,GL_POLYGON,GL_TRIANGLES,GL_QUADS,GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_QUAD_STRIPS十种。
OpenGL的图元属性
●用voidglPointSize(GLfloatsize)设置绘图点的大小;
●用voidglLineWidth(GLfloatwidth)设置线的宽度;
●voidglLineStipple(GLintfactor,GLushortpattern)设置点划线的模式。
需用glEnable(GL_LINE_STIPPLE)激活点划线的模式。
●缺省时,多边形内部使用当前颜色填充,也可通过函数
●voidglPolygonStipple(constGLubyte*mask)调用32X32的与窗口平行的位图填充。
OpenGL的特点
●OpenGLstatemachineOpenGL的行为由一系列系统状态决定,一个状态设定以后,直到用户改变它时才改变。
●每个状态变量或模式都有缺省值。
●许多状态可由glEnable()或glDisable()激活或关闭。
●根据数据类型,可用glGetBooleanv(),glGetDoublev(),glGetFloatv(),glGetIntegerv()查询当前的状态值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机图形学OpenGL编程初步12 第二章 OpenGL入门 计算机 图形学 OpenGL 编程 初步 12 第二 入门