58
Human Computer Human Computer Interface and Interface and Computer Computer Graphics Graphics 第第第第第第第第 第第第第第第第第 2 2 OpenGL OpenGL 第第第第 第第第第 第第第第 第第第 [email protected]

Human Computer Interface and Computer Graphics

  • Upload
    chavez

  • View
    91

  • Download
    1

Embed Size (px)

DESCRIPTION

Human Computer Interface and Computer Graphics. 第一章 计算机图形学基础 ( 2 ) OpenGL 编程基础 主讲教师 肖双九 [email protected]. 本讲内容提要. OpenGL 简介 OpenGL 编程基础 OpenGL 的 MFC 编程. 一、 OpenGL 简介. 1.1 OpenGL 简介. 1.1.1 OpenGL 是什么? 是一个开放的图形标准 是图形硬件的软件接口 是完全独立于窗口系统、操作系统和硬件系统环境的图形开发环境 将 2D 或 3D 对象绘入帧缓存中 - PowerPoint PPT Presentation

Citation preview

Page 1: Human Computer Interface and Computer Graphics

Human Computer Human Computer Interface andInterface and

Computer Computer GraphicsGraphics

第一章第一章 计算机图形学基础 计算机图形学基础

(( 22 )) OpenGLOpenGL 编程基础编程基础

主讲教师 肖双九[email protected]

Page 2: Human Computer Interface and Computer Graphics

本讲内容提要本讲内容提要 OpenGL OpenGL 简介简介 OpenGLOpenGL 编程基础编程基础 OpenGLOpenGL 的的 MFCMFC 编程编程

Page 3: Human Computer Interface and Computer Graphics

一、一、 OpenGL OpenGL 简介简介

Page 4: Human Computer Interface and Computer Graphics

1.1 1.1 OpenGLOpenGL 简介简介 1.1.1 1.1.1 OpenGLOpenGL 是什么?是什么?

是一个开放的图形标准是一个开放的图形标准 是图形硬件的软件接口是图形硬件的软件接口 是完全独立于窗口系统、操作系统和硬件系统是完全独立于窗口系统、操作系统和硬件系统

环境的图形开发环境环境的图形开发环境 将将 2D2D 或或 3D3D 对象绘入帧缓存中对象绘入帧缓存中 包含了大约包含了大约 250250 个函数个函数 不提供构建复杂三维模型的高层命令或函数,不提供构建复杂三维模型的高层命令或函数,

一切模型的绘制都从点、线、面开始一切模型的绘制都从点、线、面开始

Page 5: Human Computer Interface and Computer Graphics

1.1.2 1.1.2 OpenGLOpenGL 能做什么?能做什么? 创建二维和三维物体创建二维和三维物体 布置场景并以适当的角度观察场景布置场景并以适当的角度观察场景 在场景中引入光线在场景中引入光线 纹理映射纹理映射 实现特殊效果实现特殊效果 绘制位图和图像绘制位图和图像 制作平滑动画制作平滑动画 提供实现交互技术的机制提供实现交互技术的机制

Page 6: Human Computer Interface and Computer Graphics

1.1.3 1.1.3 OpenGLOpenGL 有何特点?有何特点?

工业标准工业标准——其规范由独立的国际协会(——其规范由独立的国际协会( OpenGLOpenGL 体体系结构审查委员会,即系结构审查委员会,即 OpenGL ARB OpenGL ARB )进行指导;)进行指导;

稳定性稳定性——向后兼容,确保已有的应用程序在新版本——向后兼容,确保已有的应用程序在新版本上的运行;上的运行;

可靠性可靠性——在任何操作系统、窗口系统,任何——在任何操作系统、窗口系统,任何 OpenGOpenGLL 的应用程序在任何兼容的的应用程序在任何兼容的 OpenGL APIOpenGL API 的硬件上都的硬件上都显示一致的视觉效果;显示一致的视觉效果;

Page 7: Human Computer Interface and Computer Graphics

可扩展性可扩展性———— OpenGL APIOpenGL API 的扩充机制支持硬件的各的扩充机制支持硬件的各种新特征;种新特征;

可扩充性可扩充性———— OpenGLOpenGL 程序可以扩充到开发者选择的程序可以扩充到开发者选择的任何机器类型上运行;任何机器类型上运行;

易用性易用性———— OpenGLOpenGL 函数具有和强的逻辑性,代码量函数具有和强的逻辑性,代码量小,程序员不必考虑指定硬件的特性。小,程序员不必考虑指定硬件的特性。

Page 8: Human Computer Interface and Computer Graphics

1.2 1.2 OpenGLOpenGL 工作流程工作流程 1.2.11.2.1 OpenGLOpenGL 的工作流程的工作流程

求值器

CPU 显示列表

逐点操作和图元组装

光栅化

纹理组装

每个片元的操作 帧缓存

像素操作

几何数据

像素数据

Page 9: Human Computer Interface and Computer Graphics

顶点数据包括:顶点数据包括: 位置坐标位置坐标 法向量 法向量 RGBRGB 颜色值颜色值 纹理坐标等纹理坐标等

像素数据包括:像素数据包括:像素像素位图位图图像图像

图形数据处理的对象图形数据处理的对象 几何数据几何数据 像素数据像素数据

OpenGLOpenGL 几何图元几何图元(点、线和多边形)最(点、线和多边形)最终都是由顶点描述的终都是由顶点描述的

Page 10: Human Computer Interface and Computer Graphics

像素数据经过的像素操作:像素数据经过的像素操作: 缩放缩放 偏置偏置 映射映射 纹理组装纹理组装 光栅化光栅化 片元操作片元操作 送入帧缓存,显示送入帧缓存,显示

几何数据经过的操作:几何数据经过的操作: 求值器计算求值器计算 逐点操作和图元组装逐点操作和图元组装 光栅化光栅化 片元操作片元操作 送入帧缓存,显示送入帧缓存,显示

Page 11: Human Computer Interface and Computer Graphics

1.2.21.2.2 OpenGLOpenGL 图形的具体操作步骤图形的具体操作步骤

利用几何图元(点、线、多边形)构造物体模型,利用几何图元(点、线、多边形)构造物体模型,建立物体的数学描述建立物体的数学描述

在三维空间中选择合适的位置放置物体,并确定观在三维空间中选择合适的位置放置物体,并确定观看场景的视点看场景的视点

计算场景中所有物体的颜色,包括光照和纹理映射计算场景中所有物体的颜色,包括光照和纹理映射

把场景中物体模型的数学描述和颜色信息进行光栅化,把场景中物体模型的数学描述和颜色信息进行光栅化,在显示器上显示在显示器上显示

Page 12: Human Computer Interface and Computer Graphics

二、二、 OpenGLOpenGL 编程基础编程基础

Page 13: Human Computer Interface and Computer Graphics

2.1 2.1 OpenGLOpenGL 编程的编程的基本设置基本设置 2.1.12.1.1 OpenGLOpenGL 的库函数的库函数

核心库核心库 (GL)(GL)

实用库实用库 (GLU)(GLU)

辅助库辅助库 (GLAUX)(GLAUX)

工具库工具库 ( GLUT )( GLUT )

OpenGLOpenGL 扩展 扩展 (GLEX/GLEW/GLEE)(GLEX/GLEW/GLEE)

Page 14: Human Computer Interface and Computer Graphics

2.1 2.1 OpenGLOpenGL 编程的编程的基本设置基本设置 2.1.12.1.1 OpenGLOpenGL 的库函数的库函数

核心库核心库 (GL)(GL) OpenGLOpenGL最基本的函数库,包含最基本的函数库,包含 115115 个函数个函数 顶点操作顶点操作 定义光照及颜色定义光照及颜色生成纹理坐标生成纹理坐标执行矩阵转换执行矩阵转换 像素操作像素操作 计算多项式计算多项式使用显示列表使用显示列表获取获取 OpenGLOpenGL状态变量状态变量 对应的头文件和库文件:对应的头文件和库文件: gl.h/opengl32.lib/opengl32.dllgl.h/opengl32.lib/opengl32.dll核心函数均以核心函数均以 glgl 开头,如:开头,如: glLineStripple() glLineStripple() /*/*长划线长划线 **

//

Page 15: Human Computer Interface and Computer Graphics

实用库实用库 (GLU)(GLU)比核心库更上层的库函数,包括比核心库更上层的库函数,包括 4343 个函数个函数 纹理映射纹理映射 坐标变换坐标变换 绘制绘制 NURBSNURBS曲线和曲面曲线和曲面 绘制球体、圆柱体和圆盘等简单几何形体绘制球体、圆柱体和圆盘等简单几何形体 对应的头文件和库文件:对应的头文件和库文件: glu.hglu.h

glu32.libglu32.lib

glu32.dllglu32.dll库函数均以库函数均以 gluglu为前缀,如:为前缀,如: gluPerspective()gluPerspective() /*/* 定义视景体定义视景体 */*/

gluLookAt()gluLookAt() /* /* 定义视点定义视点 */*/

Page 16: Human Computer Interface and Computer Graphics

辅助库辅助库 (GLAUX)(GLAUX)

提供基本的窗口管理函数,如初始化窗口,处理窗口和提供基本的窗口管理函数,如初始化窗口,处理窗口和事件输入等,包括事件输入等,包括 3131 个函数个函数

提供简单形体的命令函数,如:球体、圆环、圆柱体、提供简单形体的命令函数,如:球体、圆环、圆柱体、立方体等立方体等

对应的头文件和库文件:对应的头文件和库文件: glaux.hglaux.h

glaux.libglaux.lib

glaux.dllglaux.dll库函数均以库函数均以 auxaux为前缀,如:为前缀,如: auxInitDisplayModeauxInitDisplayMode ()() /*/*初始化显示模式初始化显示模式 */*/

auxDIBImageLoad( );auxDIBImageLoad( ); /*/*返回读入的图像返回读入的图像 */*/

Page 17: Human Computer Interface and Computer Graphics

工具库工具库 GLUTGLUT

与窗口系统独立的工具包,提供管理事件的命令函数,与窗口系统独立的工具包,提供管理事件的命令函数,包含包含 3030 多个函数多个函数

多窗口绘制多窗口绘制 处理回调驱动事件处理回调驱动事件 复杂的输入装置复杂的输入装置 空闲函数和时钟空闲函数和时钟 简单的层叠式弹出菜单功能简单的层叠式弹出菜单功能生成复杂实体模型和线框模型,如茶壶、球体等生成复杂实体模型和线框模型,如茶壶、球体等 支持位图字体和笔画字体支持位图字体和笔画字体 窗口管理函数窗口管理函数 对应的头文件和库文件:对应的头文件和库文件: glut.hglut.h glut32.libglut32.lib glut32.dllglut32.dll库函数均以库函数均以 glutglut为前缀,如为前缀,如 glutCreateWindow()glutCreateWindow() /*/*初始化窗口初始化窗口 */*/

Page 18: Human Computer Interface and Computer Graphics

工具库工具库 GLUTGLUT

GLUIGLUI 是一个基于是一个基于 GLUTGLUT 的用户界面开发库的用户界面开发库 提供更复杂多样的界面开发工具提供更复杂多样的界面开发工具

多窗口多窗口按钮按钮单选及复选框单选及复选框微调控制器微调控制器静态文本框静态文本框控件面板控件面板虚线分区虚线分区

Page 19: Human Computer Interface and Computer Graphics

工具库工具库 GLUTGLUT

GLUIGLUI 界面开发实例界面开发实例

Page 20: Human Computer Interface and Computer Graphics

对对 Windows95/98/NTWindows95/98/NT 窗口系统的扩展(窗口系统的扩展( WGLWGL )) 包括包括 1616 个个 WGLWGL 函数和函数和 66 个个 Win32 APIWin32 API 函数函数 创建绘制描述表(创建绘制描述表( Render ContextRender Context ,即设备描,即设备描

述表述表 Devise ContextDevise Context 的的 OpenGLOpenGL 形式)形式) 创建位图字体,使用位图和轮廓字体创建位图字体,使用位图和轮廓字体 交换前后帧缓存交换前后帧缓存 查找颜色调色板查找颜色调色板 Win32Win32库函数用以初始化像素格式、控制绘制,库函数用以初始化像素格式、控制绘制,

提供访问提供访问WGLWGL 的相应设置的相应设置 对应的头文件:对应的头文件: wgl.hwgl.h WGLWGL库函数均以库函数均以 wglwgl 开头,如:开头,如:

wglCreateContext();   wglCreateContext();   /*/* 创建绘制描述表创建绘制描述表 */*/

wglDeleteContext();   wglDeleteContext();   /*/* 删除绘制描述表删除绘制描述表 */*/ Win32 APIWin32 API 函数无前缀函数无前缀

Page 21: Human Computer Interface and Computer Graphics

OpenGLOpenGL 的版本升级的版本升级

OpenGL 1.1 OpenGL 1.1 (( 19951995年)年) 其中包括改进打印机支持,在增强元文件中包含其中包括改进打印机支持,在增强元文件中包含

OpenGLOpenGL 的调用,顶点数组的新特性,提高顶点的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等形边缘标识的传输速度,引入了新的纹理特性等

OpenGL 1.3OpenGL 1.3 (( 20012001 ))增加了立方纹理贴图、纹理环境、多重采样、纹增加了立方纹理贴图、纹理环境、多重采样、纹

理框架压缩等扩展指令理框架压缩等扩展指令

OpenGL 1.4 OpenGL 1.4 (( 20022002 ))加入了深度纹理/阴影纹理、顶点设计框架、自加入了深度纹理/阴影纹理、顶点设计框架、自

动纹理贴图等简单的功能动纹理贴图等简单的功能

Page 22: Human Computer Interface and Computer Graphics

OpenGLOpenGL 的版本升级的版本升级 OpenGL 1.5OpenGL 1.5 (( 20032003 ))

包含包含 ARBARB 制定的“正式扩展规格绘制语言”(制定的“正式扩展规格绘制语言”( OOpenGL Shading Language v1.0penGL Shading Language v1.0 ),该语言用),该语言用于着色对象、顶点着色、片断着色等扩展功能,于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代同时也将作为下一代 OpenGL 2.0OpenGL 2.0 版本的内核。版本的内核。还增加了顶点缓冲对象(可提高透视性能)、非还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理乘方纹理 (( 可提高纹理内存的使用效率可提高纹理内存的使用效率 )) 以及阴以及阴影功能、隐蔽查询功能等影功能、隐蔽查询功能等

OpenGL 2.0OpenGL 2.0 (( 20052005 )) 复杂的核心被彻底精简;复杂的核心被彻底精简; 完全的硬件可编程能力;完全的硬件可编程能力;改进的内存管理机制、支持高级像素处理;改进的内存管理机制、支持高级像素处理; 扩展至数字媒体领域,使之跨越高端图形和多媒扩展至数字媒体领域,使之跨越高端图形和多媒

体范畴;体范畴; 支持嵌入式图形应用支持嵌入式图形应用

Page 23: Human Computer Interface and Computer Graphics

OpenGLOpenGL 的版本升级的版本升级

OpenGL3.0OpenGL3.0 (( 20082008 ))

增加几何着色渲染,整数指令集,统一缓存,原增加几何着色渲染,整数指令集,统一缓存,原生支持非线性色彩空间等生支持非线性色彩空间等

只是指令集的扩展只是指令集的扩展 在在 20002000年以前,年以前, 3D3D游戏游戏 APIAPI领域是领域是 OpenGLOpenGL

和和 DirectXDirectX 平分天下.平分天下. OpenGLOpenGL 由于执行效率由于执行效率高,画面效果更出色,被更多游戏厂商所认可,高,画面效果更出色,被更多游戏厂商所认可,但是接下来几年但是接下来几年 DirectXDirectX 系列奋起直追,在消费系列奋起直追,在消费3D3D领域将领域将 OpenGLOpenGL远远的抛在了后头远远的抛在了后头

Page 24: Human Computer Interface and Computer Graphics

OpenGLOpenGL 扩展扩展

WindowWindow目前只支持目前只支持 OpenGL1.1OpenGL1.1 的函数,要使用的函数,要使用这些这些 OpenGLOpenGL 以上版本的高级特性,就必须下载最以上版本的高级特性,就必须下载最新的扩展新的扩展

不同的显卡公司,也会发布一些只有自家显卡才支 不同的显卡公司,也会发布一些只有自家显卡才支 持的扩展函数持的扩展函数

Page 25: Human Computer Interface and Computer Graphics

OpenGLOpenGL 扩展扩展

使用使用 OpenGLOpenGL 扩展扩展 ,,首先要判断显卡支持的扩展首先要判断显卡支持的扩展

以以 GL_EXTENSIONSGL_EXTENSIONS为参数调用为参数调用 glGetString()glGetString()函数,就能获得当前显卡所支持的函数,就能获得当前显卡所支持的 glgl 扩展扩展

const GLubyte *str = glGetString(GL_EXTENSIconst GLubyte *str = glGetString(GL_EXTENSIONS) ;ONS) ;

cout << str << endl ;cout << str << endl ;

用用 GLU_EXTENSIONSGLU_EXTENSIONS获取显卡支持的获取显卡支持的 GLUGLU 扩展扩展

然后调用扩展函数然后调用扩展函数 不同扩展库的调用方法是不同的不同扩展库的调用方法是不同的 扩展头文件扩展头文件 glext.hglext.h , , 提供高版本提供高版本 OpenGLOpenGL 所需所需

要的各种常数声明以及函数指针声明要的各种常数声明以及函数指针声明

Page 26: Human Computer Interface and Computer Graphics

OpenGLOpenGL 扩展库扩展库

GLEWGLEW 是一个跨平台的扩展库是一个跨平台的扩展库 ,, 能自动识 别平台所能自动识 别平台所支持的全部支持的全部 OpenGLOpenGL 高级扩展函数高级扩展函数

只要包含一个只要包含一个 glew.hglew.h 头文件,就能使用头文件,就能使用 gl,glu,glegl,glu,glext,wgl,glxxt,wgl,glx 的全 部函数的全 部函数

GLEWGLEW 支持目前流行的各种操作系统( 支持目前流行的各种操作系统( Windows, Windows, Linux, Mac OS X, FreeBSD, Irix, and SolarisLinux, Mac OS X, FreeBSD, Irix, and Solaris ))

GLEEGLEE也是一个跨平台的 也是一个跨平台的 OpenGLOpenGL 扩展函数库,用扩展函数库,用于载入于载入 OpenGLOpenGL 的高级扩展函数,以方便程序员使的高级扩展函数,以方便程序员使用显卡的最新扩展功能。和用显卡的最新扩展功能。和 glewglew库的作用差不多库的作用差不多 ,,是一个比是一个比 glewglew更轻量级的扩展使用方式 更轻量级的扩展使用方式

Page 27: Human Computer Interface and Computer Graphics

OpenGLOpenGL 学习网站学习网站

http://http://www.opengl.orgwww.opengl.org//

http://www.opengl.org/wiki/index.php/Mhttp://www.opengl.org/wiki/index.php/Main_ain_

Page 28: Human Computer Interface and Computer Graphics

2.1.22.1.2 OpenGL OpenGL 编程环境编程环境 可工作在多种操作系统上可工作在多种操作系统上

WindowsWindows UnixUnix MacOSMacOS

支持支持 OpenGLOpenGL 的语言有的语言有 C/C++C/C++ FortranFortran AdaAda JavaJava PascalPascal

使用这些语言调用使用这些语言调用 OpenGLOpenGL 的图形库函数的图形库函数

Page 29: Human Computer Interface and Computer Graphics

缺省包含 缺省包含 Opengl32.dll Opengl32.dll 和 和 glu32.dllglu32.dll (核心库(核心库和实用库)和实用库)

可在网上可在网上 DownloadDownload 到到 glut32.dllglut32.dll 、、 glaux.dllglaux.dll等其他等其他 OpenGLOpenGL 的动态链接库,拷贝到系统目的动态链接库,拷贝到系统目录中录中

2.1.3 2.1.3 OpenGLOpenGL 库的安装库的安装 本课程讲解的本课程讲解的 OpenGLOpenGL 程序开发程序开发

WindowsWindows 系列系列 Microsoft Visual 2005Microsoft Visual 2005

库安装库安装 系统目录下应包含系统目录下应包含 OpenGLOpenGL 的动态链接库的动态链接库

系统目录系统目录 C:\Windows\system32 C:\Windows\system32 或 或 C:\WINNT\system32C:\WINNT\system32

Page 30: Human Computer Interface and Computer Graphics

VCVC 的安装目录下应包含的安装目录下应包含 OpenGLOpenGL 的静态库的静态库

VCVC 安装目录 安装目录 C:\Microsoft Visual Studio\VC\LibC:\Microsoft Visual Studio\VC\Lib

缺省包含 缺省包含 Opengl32.libOpengl32.lib 和 和 glu32.libglu32.lib(核心库和实用库)(核心库和实用库)

可将可将 glut32.libglut32.lib 、、 glaux.libglaux.lib 等其他等其他 OpeOpenGLnGL 的静态库拷贝到该目录的静态库拷贝到该目录

Page 31: Human Computer Interface and Computer Graphics

VCVC 的安装目录下应包含的安装目录下应包含 OpenGLOpenGL 的的头文件头文件

VC安装目录 C:\Microsoft Visual Studio\VC\Include\GL

缺省包含 缺省包含 gl.h gl.h 和 和 glu.hglu.h 可将可将 glut.hglut.h 、、 glaux.hglaux.h 等其他等其他 OpenOpen

GLGL 的头文件拷贝到该目录的头文件拷贝到该目录

Page 32: Human Computer Interface and Computer Graphics

2.1.4 2.1.4 OpenGLOpenGL 程序的编译连接设置程序的编译连接设置 选择“工程”(选择“工程”( projectproject )) ->“->“设置”(设置”( settisetti

ngsngs )。)。 选择“连接”(选择“连接”( LinkLink )标签。)标签。 增加下面的文件到增加下面的文件到 Object/library modules:Object/library modules: OpenGL32.lib glut32.lib glu32.libOpenGL32.lib glut32.lib glu32.lib 用空格间隔用空格间隔

Page 33: Human Computer Interface and Computer Graphics
Page 34: Human Computer Interface and Computer Graphics

2.1.4 2.1.4 OpenGLOpenGL 程序的编译连接设置程序的编译连接设置设置问题设置问题

如何设置可使如何设置可使 VCVC 创建的创建的 consoleconsole 程序没有控程序没有控制台窗口制台窗口 ,,只有只有 OpenGLOpenGL 窗口窗口 ??

Page 35: Human Computer Interface and Computer Graphics

2.2 OpenGL2.2 OpenGL 程序的基本结构程序的基本结构

在窗口中绘制一个线框球体在窗口中绘制一个线框球体 Sphere.cSphere.c

2.2.1 2.2.1 一个简单的一个简单的 OpenGLOpenGL 程序程序

Page 36: Human Computer Interface and Computer Graphics

/*包含 OpenGL 头文件 *//*由于 glut.h已经包含了 gl.h和 glu.h,因此只需包含 glut.h 就可以了 */

#include<windows.h>#include<GL/glut.h>#include<stdlib.h>

void display(void) /*显示回调函数,设定显示内容 */

{//指定清除颜色缓存所用的颜色值,这里为黑色glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); //用预先设定的值清除颜色

缓存

glColor3f(0.9,0.7,0.7); /*设置显示对象的颜色 */

glutWireSphere(0.8,18,18); /* 显示线框球体 */

glFlush(); /*强迫绘制完成 */}

Page 37: Human Computer Interface and Computer Graphics

int main(void) /*主函数 */

{/****1. 显示模式和窗口的初始化 ****/glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(200,200);glutCreateWindow("Hi Sphere"); /****2.调用显示函数 ****/glRotatef(45.0,1.0,0.0,0.0);glutDisplayFunc(display);/*glutReshapeFunc(reshape);glutMouseFunc(movelight); glutMotionFunc(motion);glutKeyFunc(keyboard);*/

/****3. 显示绘制 ****/ glutMainLoop();

return(0);

}

Page 38: Human Computer Interface and Computer Graphics

int main(void){

/****1. 显示模式和窗口的初始化 ****/

//设置窗口的显示模式为单缓存,颜色模式为 RGB

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

// 定义窗口尺寸,单位为像素glutInitWindowSize(300,300);

// 定义窗口在屏幕上的位置,左上角的位置坐标glutInitWindowPosition(200,200);

//初始化窗口,指定窗口的名称glutCreateWindow("Hi Sphere");

Page 39: Human Computer Interface and Computer Graphics

/****2. 调用显示函数 ****/// 对场景中的物体进行旋转变换,使线框球体更有立体感glRotatef(45.0,1.0,0.0,0.0); // 调用窗口刷新的回调函数 glutDisplayFunc(displ

ay);

/****3.显示绘制 ****/

//触发显示回调函数,先前所有的设置均在窗口中显示出来 glutMainLoop();

return(0);}

Page 40: Human Computer Interface and Computer Graphics

2.2.2 OpenGL2.2.2 OpenGL 程序的几个重要环节程序的几个重要环节 设置清除窗口的颜色设置清除窗口的颜色 Void glClearColor Void glClearColor (GLclampf (GLclampf redred, GLclampf , GLclampf greengreen, ,

GLclampf GLclampf blueblue, GLclampf , GLclampf alphaalpha););

redred 、、 greengreen 、、 blueblue 和和 alphaalpha变量分别代表红、绿、蓝和变量分别代表红、绿、蓝和 AlphaAlpha 的颜色的颜色 都在都在 [0.0,1.0][0.0,1.0]之间之间

清除颜色缓存清除颜色缓存Void glClearVoid glClear (GLbitfield (GLbitfield maskmask););

清除指定缓存,并将清除指定缓存,并将 glClearColor () glClearColor () 设定的颜色写入颜色缓存设定的颜色写入颜色缓存变量变量 maskmask 为要清除的缓存为要清除的缓存

MaskMask变量变量 清除的缓存清除的缓存

GL_COLOR_BUFFER_BITGL_COLOR_BUFFER_BIT 颜色缓存颜色缓存GL_DEPTH_BUFFER_BITGL_DEPTH_BUFFER_BIT 深度缓存深度缓存GL_ACCUM_BUFFER_BITGL_ACCUM_BUFFER_BIT 累加缓存累加缓存

GL_STENCIL_BUFFER_BITGL_STENCIL_BUFFER_BIT 模板缓存模板缓存

Page 41: Human Computer Interface and Computer Graphics

glClear()glClear() 的调用的调用glClearglClear (( GL_COLOR_BUFFER_BITGL_COLOR_BUFFER_BIT )) ;;

glClearglClear (( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BITGL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )) ;;

强迫绘制完成强迫绘制完成glFlushglFlush();();因为因为 OpenGLOpenGL 图形系统是顺序执行的。当一个图形系统是顺序执行的。当一个

OpenGLOpenGL 程序向程序向 CPUCPU 发出请求时,其他的图形发出请求时,其他的图形硬件很可能正在处理光照、纹理映射等其他操作。硬件很可能正在处理光照、纹理映射等其他操作。这个绘制命令要执行,必须等待其他命令结束。这个绘制命令要执行,必须等待其他命令结束。带来很大性能损耗。带来很大性能损耗。

glFlush()glFlush() 强迫发出的命令开始执行,保证强迫发出的命令开始执行,保证 OpenOpenGLGL 程序发出的所有命令都能在有限的时间内执程序发出的所有命令都能在有限的时间内执行。行。

几乎所有的几乎所有的 OpenGLOpenGL 程序都要调用该命令程序都要调用该命令

Page 42: Human Computer Interface and Computer Graphics

2.3 OpenGL2.3 OpenGL 程序的键盘交互程序的键盘交互 GlutGlut 提供的键盘响应回调函数提供的键盘响应回调函数

在在 main()main() 函数中调用函数中调用 glutKeyboardFunc(key);glutKeyboardFunc(key);

key()key() 为键盘响应回调函数为键盘响应回调函数 响应键盘消息循环响应键盘消息循环

Page 43: Human Computer Interface and Computer Graphics

int keyinfo=0;void key(unsigned char key, int x, int y){

switch(key){case 'd':

keyinfo=0; glutPostRedisplay();

break;case 's': keyinfo=1;

glutPostRedisplay();break;

case ‘q’: case 27:

exit(0);break;

default:break;

}}

Page 44: Human Computer Interface and Computer Graphics

void display(void){

glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.9,0.7,0.7);glRotatef(45.0,1.0,0.0,0.0);if(keyinfo==0) ……if(keyinfo==1) ……

glFlush();}int main(int argc,char** argv){

……glutKeyboardFunc(key);glutDisplayFunc(display);glutMainLoop();……

}

Keyboard.exe

Page 45: Human Computer Interface and Computer Graphics

三、三、 OpenGLOpenGL 的的 MFCMFC编程编程

Page 46: Human Computer Interface and Computer Graphics

本节内容本节内容 VCVC 中中 OpenGLOpenGL 编程步骤编程步骤 OpenGLOpenGL 的像素格式的像素格式 OpenGLOpenGL 绘制描述表绘制描述表

Page 47: Human Computer Interface and Computer Graphics

3.1 VC3.1 VC 中中 OpenGLOpenGL 编程步骤编程步骤 使用使用 AppWizardAppWizard 创建应用程序框架;创建应用程序框架; 在在 viewview 类中添加下列成员函数类中添加下列成员函数

重载重载 PreCreateWindowPreCreateWindow 函数函数 响应响应 WM_CREATEWM_CREATE 消息的 消息的 OnCreateOnCreate 函数函数 响应响应 WM_SIZEWM_SIZE 消息的 消息的 OnSizeOnSize 函数函数 响应响应 WM_ERASEBKGNDWM_ERASEBKGND 消息的 消息的 OnEraseBKgOnEraseBKg

ndnd 函数函数 响应响应 WM_DESTORYWM_DESTORY 消息的 消息的 OnDestoryOnDestory 函数函数 重载重载 OnInitialUpdateOnInitialUpdate 函数函数 重载重载 OnDrawOnDraw 函数函数

Page 48: Human Computer Interface and Computer Graphics

3.1 VC3.1 VC 中中 OpenGLOpenGL 编程步骤编程步骤 在在 PreCreateWindowPreCreateWindow 函数中添加语句:函数中添加语句:cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN;保证像素格式能正确设置保证像素格式能正确设置 设置像素格式,创建绘制描述表设置像素格式,创建绘制描述表 RCRC

在响应在响应 WM_CREATEWM_CREATE 消息的 消息的 OnCreateOnCreate 函数中设置函数中设置 响应响应 WM_SIZEWM_SIZE 消息消息

在 在 OnSizeOnSize 函数中设置视景体、视口等函数中设置视景体、视口等 响应响应 WM_ERASEBKGNDWM_ERASEBKGND 消息消息

清屏操作。缺省时是用当前背景色填充整个窗口清屏操作。缺省时是用当前背景色填充整个窗口

Page 49: Human Computer Interface and Computer Graphics

3.1 VC3.1 VC 中中 OpenGLOpenGL 编程步骤编程步骤 重载重载 OnInitialUpdateOnInitialUpdate 函数函数

绘制初始化——创建显示列表、设置光照、材绘制初始化——创建显示列表、设置光照、材质、装载纹理等质、装载纹理等

在在 OnDrawOnDraw 函数中绘制函数中绘制 OpenGLOpenGL 场景场景 响应响应 WM_TIMERWM_TIMER 消息消息

生成动画生成动画 响应响应 WM_DESTORYWM_DESTORY 消息消息

销毁窗口、删除绘制描述表销毁窗口、删除绘制描述表 必要时可重载必要时可重载 OnIdleOnIdle 函数函数

Page 50: Human Computer Interface and Computer Graphics

3.2 OpenGL3.2 OpenGL 的像素格式的像素格式

进行进行 OpenGLOpenGL 绘制的窗口必须设置像素格绘制的窗口必须设置像素格式式

包括绘制所需要的各种属性包括绘制所需要的各种属性 一个窗口只能设置一次像素格式一个窗口只能设置一次像素格式 一般在响应一般在响应 WM_CREATEWM_CREATE 消息的 消息的 OnCreaOnCrea

tete 函数中实现函数中实现

Page 51: Human Computer Interface and Computer Graphics

3.2 OpenGL3.2 OpenGL 的像素格式的像素格式

5.2.1 OpenGL5.2.1 OpenGL 像素格式设置步骤像素格式设置步骤 填充填充 PIXELFORMATDESCRIPTORPIXELFORMATDESCRIPTOR 结构结构 调用处理像素格式的调用处理像素格式的 Win32 APIWin32 API

Page 52: Human Computer Interface and Computer Graphics

3.2 OpenGL3.2 OpenGL 的像素格式的像素格式 5.2.2 5.2.2 处理像素格式的处理像素格式的 Win32 APIWin32 API

intint ChoosePixelFormatChoosePixelFormat( ( HDC hdcHDC hdc ,,

CONST PIXELFORMATDESCRIPTOR *ppfdCONST PIXELFORMATDESCRIPTOR *ppfd););函数功能:函数功能:

选取最接近程序员所提供的像素格式模板选取最接近程序员所提供的像素格式模板 PFDPFD 的设备描述表的设备描述表 DCDC 所所支持的像素格式。支持的像素格式。 WindowsWindows 试图尽可能满足程序员的要求试图尽可能满足程序员的要求

执行成功,返回执行成功,返回 DCDC 中匹配像素格式的索引值;如果失败,返回中匹配像素格式的索引值;如果失败,返回 00 可调用可调用 GetLastErroGetLastErro 获得详细的错误信息获得详细的错误信息

参数说明:参数说明: hdchdc 指定设备描述表指定设备描述表 ppfdppfd 是指向是指向 PIXELFORMATDESCRIPTORPIXELFORMATDESCRIPTOR 结构的指针,是程序结构的指针,是程序

员所希望的像素格式员所希望的像素格式

Page 53: Human Computer Interface and Computer Graphics

3.2.2 3.2.2 处理像素格式的处理像素格式的 Win32 APIWin32 API

BOOLBOOL SetPixelFormat SetPixelFormat( HDC hdc( HDC hdc ,, int iPixelFormat,int iPixelFormat, CONST PIXELFORMATDESCRIPTOR *ppfd);CONST PIXELFORMATDESCRIPTOR *ppfd);函数功能:函数功能:

设置设置 DCDC 的当前像素格式,该格式由像素格式索引的当前像素格式,该格式由像素格式索引 iPixelFormatiPixelFormat指定指定

切记检查该函数的返回值,如果执行失败,所有的切记检查该函数的返回值,如果执行失败,所有的 OpenGLOpenGL 调用都调用都没有结果没有结果

参数说明:参数说明: hdchdc 指定设备描述表指定设备描述表 iPixelFormatiPixelFormat 是是 DCDC 中要设置成的像素格式索引值中要设置成的像素格式索引值 ppfdppfd 是指向是指向 PIXELFORMATDESCRIPTORPIXELFORMATDESCRIPTOR 结构的指针,是程序结构的指针,是程序

员所希望的像素格式员所希望的像素格式

Page 54: Human Computer Interface and Computer Graphics

3.2.2 3.2.2 处理像素格式的处理像素格式的 Win32 APIWin32 API

intint DescribePixelFormat DescribePixelFormat( HDC hdc( HDC hdc ,, int iPixelFormat, UINT nBytes,int iPixelFormat, UINT nBytes, CONST PIXELFORMATDESCRIPTOR *ppfd);CONST PIXELFORMATDESCRIPTOR *ppfd);函数功能:函数功能:

对给定的对给定的 DCDC 和像素格式索引,用其中指定的像素格式填充和像素格式索引,用其中指定的像素格式填充 PFDPFD数据结构数据结构

如果执行成功如果执行成功 , , 返回返回 DCDC 支持的最大像素格式索引值;执行失败,支持的最大像素格式索引值;执行失败,返回返回 00

如果如果 ppfdppfd 为为 NULL,NULL, 该函数返回该函数返回 DCDC 支持的最大像素格式索引值支持的最大像素格式索引值

参数说明:参数说明: nBytesnBytes 是是 ppfdppfd 所指向的数据结构的大小,该值可设为所指向的数据结构的大小,该值可设为 sizeof(PIsizeof(PI

XELFORMATDESCRIPTOR)XELFORMATDESCRIPTOR)

Page 55: Human Computer Interface and Computer Graphics

3.2.2 3.2.2 处理像素格式的处理像素格式的 Win32 APIWin32 API

intint GetPixelFormat GetPixelFormat( HDC hdc);( HDC hdc);

函数功能:函数功能: 获得获得 DCDC 当前像素格式的索引值当前像素格式的索引值 如果执行成功如果执行成功 , , 返回返回 DCDC 当前像素格式的索引值;执行失败,返当前像素格式的索引值;执行失败,返

回回 00

Page 56: Human Computer Interface and Computer Graphics

3.3 OpenGL3.3 OpenGL 绘制描述表绘制描述表

3.3.1 RC3.3.1 RC 与与 DCDC 窗口中显示文字或图象之前必须引入设备描述窗口中显示文字或图象之前必须引入设备描述

表表 DCDC 调用调用 OpenGLOpenGL 的每个线程都需要一个当前的的每个线程都需要一个当前的

绘制描述表绘制描述表 RCRC RCRC 是传递所有是传递所有 OpenGLOpenGL 命令的端口,把命令的端口,把 OpOp

enGLenGL 和窗口系统连接起来和窗口系统连接起来 DCDC 与与 RCRC 具有相同的像素格式具有相同的像素格式 RCRC 必须在必须在 DCDC 上创建上创建

Page 57: Human Computer Interface and Computer Graphics

3.3 OpenGL3.3 OpenGL 绘制描述表绘制描述表 3.3.2 RC3.3.2 RC 的创建与删除的创建与删除

HDC hdc; HDC hdc; //// 设备描述表句柄设备描述表句柄

HGLRC hglrc;HGLRC hglrc;/*/* 设置像素格式设置像素格式 */*/

…………hglrc=wglCreateContext(hdc); hglrc=wglCreateContext(hdc); //// 创建一个创建一个 RCRC

wglMakeCurrent(hdc,hglrc); wglMakeCurrent(hdc,hglrc); //// 使创建的使创建的 RCRC 成为线程当前的成为线程当前的 RCRC

/*/* 调用调用 OpenGLOpenGL 绘制函数绘制函数 */*/…………wglMakeCurrent(NULL,NULL); wglMakeCurrent(NULL,NULL); //// 绘制结束时,使绘制结束时,使 RCRC 从线程上脱离从线程上脱离

wglDeleteContext(hglrc); wglDeleteContext(hglrc); //// 删除绘制描述表删除绘制描述表 hglrchglrc

Page 58: Human Computer Interface and Computer Graphics

Assignment 1 基于基于 GLUIGLUI 编写一个应用程序编写一个应用程序

主窗口名称”主窗口名称”Assignment 1”” 提供“提供“ ModelingModeling 面板”,包含多个建模选项,可绘制面板”,包含多个建模选项,可绘制““ Teapot”Teapot” 、“、“ Sphere”Sphere” 、“、“ TorusTorus” ” 、“、“ ConCone”e” 、“、“ Icosahedron”Icosahedron”

在绘图窗口中央绘制选中的图形在绘图窗口中央绘制选中的图形 ,,并在左上角用文本显并在左上角用文本显示该图形的名称示该图形的名称

在在 PropertiesProperties 面板面板 ,, 可改变当前图形的绘制参数可改变当前图形的绘制参数 每种图形都可用”每种图形都可用”Wire Model”Wire Model” 和”和” Solid Model”Solid Model”

切换线框和实体两种绘制模式切换线框和实体两种绘制模式 场景用两个场景用两个 light,light,位置固定位置固定 ,, 可任意放置可任意放置 ** 提供颜色选择面板提供颜色选择面板 ,, 可改换模型颜色可改换模型颜色

参考控制台程序示例“参考控制台程序示例“ teapot”teapot”及及 GLUIGLUI 包中的包中的例程例程 example1-6example1-6