Transcript Vectors
计算机图形学 Computer Graphics 徐文鹏 [email protected] 教学博客http:// Opengl.cnblogs.com 个人博客http://wpxu21st.blog.163.com OpenGL编程-1.简介 • OpenGL API的发展 • OpenGL的体系结构 – 状态机 state machine • 函数 – 类型 – 格式 • 简单程序 15:14 2 API的早期历史 • 早期:硬件厂商各自为政,互不兼容,不可移植 • IFIPS (1973) 组织了两个委员会建立图形API的标 准 – 图形核心系统Graphical Kernel System (GKS):二维,同 时包含很好的工作站模型 – GKS成为ISO标准,稍后成为ANSI标准(1980s) • GKS很难推广到三维(GKS-3D) – 远远落后于硬件的发展 IFIPS: International Federation of Information Processing Societies 15:14 3 PHIGS • 程序员层次交互式图形系统Programmers Hierarchical Graphics System (PHIGS) – – – – 来自于CAD团体Arose from CAD community 保存图形的数据库模型 PHIGS+提供了三维明暗处理功能 ISO批准的第二个图形软件标准 4 SGI and GL • Silicon Graphics (SGI) 通过硬件实现流水线体系, 改良了图形工作站 (1982) • 应用程序通过一个称为GL的库与系统通讯 • 借助于GL,可以非常简单地设计出三维交互图形 应用程序 5 OpenGL • GL的成功导致了OpenGL的出现(1992),这是一个 与平台无关的API: – – – – 易于使用 与硬件非常贴近,从而可以充分发挥其功能 着重在于渲染 (rendering) 没有提供窗口和输入接口,从而避免依赖于具体的窗口 系统 6 OpenGL的发展 • 由Architectural Review Board (ARB)掌握 – – – – 成员包括SGI, Microsoft, Nvidia, HP, 3DLabs, IBM, …… 相对稳定 发展反映了新的硬件能力:着色语言 通过扩展可以指定具体平台相应的功能 7 OpenGL库 • OpenGL核心库:包含OpenGL最基本的命令函数, 它们是任何一个OpenGL实现所必须具有的 – Windows: OpenGL32 – 大多数Unix/Linux系统:GL库 – glColor3f (1.0f, 1.0f, 1.0f) • OpenGL实用库(Utility Library, GLU):对核心库的 扩充,也是任何一个OpenGL实现必备的 – 利用OpenGL核心库提供一些功能,从而避免重复编写 代码 – gluBeginSurface () 8 OpenGL库 • 与窗口系统的连接 – X Windows系统:GLX – Windows: WGL,函数以wgl开头 – Macintosh: AGL 9 GLUT • OpenGL实用工具库(OpenGL Utility Toolkit Library, GLUT) – – – – – 提供所有窗口系统的共同功能 打开窗口 从鼠标和键盘获取输入 弹出菜单 事件驱动 • 代码可以在平台间移植,但是GLUT缺乏在特定平 台上优秀工具包所具有的功能 – 滚动条 10 软件组织 application program OpenGL Motif widget or similar GLUT GLX, AGL or WGL X, Win32, Mac O/S software and/or hardware 11 GLU GL 一个简单程序 在黑色背景上画一个矩形 12 simple.cpp 13 #include <GL/glut.h> void mydisplay(){ 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(); } int main(int argc, char** argv){ glutCreateWindow("simple"); glutDisplayFunc(mydisplay); glutMainLoop(); } 如何创建-VC6 • 创建一个win32 console application类型的 workspace文件 • 创建一个C/C++文件,包含前面代码simple.cpp, 并把这个文件插入到workspace文件中 14 如何获取OpenGL? • OpenGL核心库与实用库:Windows 98, NT 3.5后系 统自带 • C/C++语言编程库:VC6 • GLUT: – 下载: www.opengl.org/resources/libraries/glut/glutdlls37beta.zip – 安装:5个文件 – 头文件,库文件,dll文件 15 OpenGL体系 geometry pipeline Immediate Mode Polynomial Evaluator CPU Display List Per Vertex Operations & Primitive Assembly Rasterization Texture Memory Pixel Operations 16 Per Fragment Operations Frame Buffer OpenGL体系 17 OpenGL的状态 • OpenGL是一个状态机(state machine) • OpenGL函数具有两种类型 – 生成基本形状 • 如果形状可见,可以得到输出 • 顶点如何被处理,基本形状的外观由状态控制 – 改变状态 • 变换函数 • 属性函数 18 默认值 • simple.cpp非常简单 • 大量使用状态变量的默认值 – 视图 – 颜色 – 窗口参数 • 以后的程序将直接改变一些默认值 19 OpenGL #defines • 绝大多数常数采用#define在头文件gl.h, glu.h和 glut.h中定义 – – – – 注意#include <glut.h>会自动包含其它两个头文件 如: glBegin(GL_POLYGON); glClear(GL_COLOR_BUFFER_BIT); • 在头文件中也定义了OpenGL数据类型: GLfloat, Gldouble,…. 20 OpenGL的函数 • 基本几何形状 –点 – 线段 – 多边形 • 属性 • 变换 – 视图Viewing – 建模Modeling • 控制(GLUT) • 输入(GLUT) • 查询Query 21 OpenGL函数名称的格式 function name dimensions glVertex3f(x,y,z) belongs to GL library x,y,z are floats glVertex3fv(p) p is a pointer to an array 22 面向对象方面的缺陷 • OpenGL不是面向对象的,因此逻辑上的一个函数 却对应着多个OpenGL函数: – glVertex3f – glVertex2i – glVertex3dv • 内在存贮模式是相同的 • 在C++中很容易创建重载函数,但效率却成为主要 问题 23 事件循环 • 注意在程序中定义了一个显示回调函数(display callback): mydisplay – 每个GLUT程序都必须有一个显示回调函数 – 只要OpenGL确定显示内容要被刷新时,显示回调函数 就会被调用。例如,当窗口被打开的时候 – main函数以程序进入事件循环后为结束 – The main function ends with the program entering an event loop 24