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