计算机图形学杨武影像科学与技术实验室东南大学计算机学院yangwu@seu.edu.cn2第二章OpenGL编程3第二章之第一节背景4基本内容OpenGLAPI的发展OpenGL的体系结构–状态机statemachineOpenGL函数–类型–格式简单程序5API的早期历史IFIPS(1973)组织了两个委员会建立图形API的标准–图形核心系统(GraphicalKernelSystem)•2D,包含很好的工作站模型–GKS成为ISO标准,之后成为ANSI标准(1980s)GKS很难推广到三维(GKS-3D)–远远落后于硬件的发展6PHIGS与XProgrammersHierarchicalGraphicsSystem(PHIGS)–来自于CAD团体–保存图形的数据库模型XWindow–DEC/MIT的成果–应用图形的客户服务Client-serverPEX把两者组合在一起–不易应用(这也是两者的缺陷)7SGI与GLSiliconGraphics(SGI)通过硬件实现流水线体系,改良了图形工作站(1982)应用程序通过一个称为GL的库与系统通讯借助于GL,可以非常简单地设计出三维交互图形应用程序8OpenGLGL的成功导致了OpenGL的出现(1992),这是一个与平台无关的API:–易于使用–与硬件非常贴近,从而可以充分发挥其功能–着重在于渲染(rendering)–没有提供窗口和输入接口,从而避免依赖于具体的窗口系统9OpenGL的发展由ArchitecturalReviewBoard(ARB)掌握–成员包括SGI,Microsoft,Nvidia,HP,3DLabs,IBM,…….–相对稳定(目前版本4.3)•发展反映了新的硬件能力–通过扩展可以指定具体平台相应的功能。10OpenGL库OpenGL核心库–Windows:OpenGL32–大多数unix/linux系统:GLOpenGL实用库(GLU)–利用OpenGL核心库提供一些功能,从而避免重复编写代码与窗口系统的连接–Xwindow系统:GLX–Windows:WGL–Macintosh:AGL11GLUTOpenGL实用工具库(GLUT)–提供所有窗口系统的共同功能•打开窗口•从鼠标和键盘获取输入•菜单•时间驱动–代码可以在平台间移植,但是GLUT缺乏在特定平台上优秀工具包所具有的功能•滚动条12软件组织GLUTGLUGLGLX,AGLorWGLX,Win32,MacO/S软件或硬件应用程序OpenGLMotifwidgetorsimilar13OpenGL体系快速模式显示列表多项式求值器逐顶点操作与基本几何体的集成光栅化逐片操作纹理内存CPU像素操作帧缓冲区几何流水线14OpenGL函数基本几何形状–点Points–线段LineSegments–多边形Polygons属性变换–视图–建模控制输入(GLUT)15OpenGL状态是一个状态机(statemachine)OpenGL函数具有两种类型–生成基本形状•如果形状可见,可以得到输出•顶点如何被处理、基本形状的外观,由状态控制–改变状态•变换函数•属性函数16面向对象方面的缺陷OpenGL不是面向对象的,因此逻辑上的一个函数却对应着多个OpenGL函数:glVertex3fglVertex2iglVertex3dv内在存储模式是相同的在C++中很容易创建重载函数,但效率却成为主要问题。17OpenGL函数名称的格式glVertex3f(x,y,z)属于GL库函数功能x,y,z为floatsglVertex3fv(p)p为指向数组的指针参数个数18OpenGL中的#defines绝大多数常数采用#define在头文件gl.h,glu.handglut.h定义–注意#includeglut.h会自动包含其它两个头文件在头文件中也定义了OpenGL数据类型:Glfloat,Gldouble,….19如何获取OpenGLOpenGL核心库与实用库:Windows98,NT3.5后系统自带C/C++语言编程库:VC6GLUT:课程网页20一个简单程序黑背景上画一个矩形21simple.c#includeGL/glut.hvoidmydisplay(){glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POLYGON);glVertex2f(-0.5,-0.5);glVertex2f(-0.5,0.5);glVertex2f(0.5,0.5);glVertex2f(0.5,-0.5);glEnd();glFlush();}intmain(intargc,char**argv){glutCreateWindow(simple);glutDisplayFunc(mydisplay);glutMainLoop();}22事件循环注意在程序中定义了一个显示回调函数(displaycallback):mydisplay–每个GLUT程序都必须有一个显示回调函数–只要OpenGL确定显示内容要被刷新时,显示回调函数就会被调用:例如,当窗口被打开的时候–main函数是程序进入事件循环做为结束23默认值simple.c非常简单大量使用状态变量的默认值–视图–颜色–窗口参数以后的程序将直接改变一些默认值