课前甜点:
这是一些怎么查看Ubuntu下opengl版本,下载的库在哪里,以及怎么编译地一些内容。
为什么阅读OpenGL编程指南(第七版)
我们的目的是从前三章中学习基本概念,并绘制手部模型,因为上一个基础篇的内容,只能让我们了解绘制的流程,虽然连着色器编程都涉及到了,但是还有很多opengl的基本概念、基本方法并不清楚。
-
第 1 章 OpenGL 简介 1
OpenGL官网这个网站包含了各种类型的通用信息,包括软件、示例程序、文档、FAQ、讨论版和新闻等。如果读者遇到任何 OpenGL 问题,这是首先应该想到的去处。OpenGL 实际上是一种独立于硬件的程序接口规范。在一种特定类型的硬件上,所使用的是它的一种特定实现。OpenGL 3.1 采用了废弃模式,删除了很多与现代图形系统不太兼容的旧功能。
-
1.1 什么是OpenGL 1
opengl大致包含700个以上的函数,
opengl不包含:
- 用户输入处理。初始化窗口的initXXX函数与opengl没有关系。
- 不包括复杂模型的绘制。只有一些基本几何图元,不过我们可以在其上开发自己的库。
opengl包含的操作:
- 根据集合图元创建形状,建立数学描述
- 选择视角
- 计算颜色
- 转换成屏幕的像素,光栅化
-
1.2 一段简单的 OpenGL 代码 3
- 函数名以gl开头,中间是代表含义的英文单词,3f是指可以接受3个浮点数作为参数
glColor3f函数确定接下来绘制物体的颜色
glOrtho指定绘制图像的坐标
glBegin、glEnd之间定义了绘制的物体
glVertex3f定义了绘制的点的三维坐标
glFlush利用缓冲区的内容执行绘制命令
-
1.4 OpenGL 是一个状态机 6
设置一种颜色然后可以让它一直生效,这就是状态。OpenGL还有很多类似的状态变量。着色器会识别这些状态进行绘制。附录B中有所有状态变量的列表(很多、很多)
-
1.5 OpenGL 渲染管线 6
-
1.6 与 OpenGL 相关的函数库 9
OpenGL只包含基本的渲染操作,为了简化编程任务,由许多基于OpenGL的高级绘图操作可以使用
GLU:执行特定任务的函数,glu开头
GLUT:隐藏不同窗口系统API的复杂性,glut开头
-
1.6.1 包含文件 9
#include<GL/gl.h>
#include<GL/glu.h>
//在win上,因为win版本的gl、glu使用了一些windows.h的宏需要包含Windows.h
#include<windows.h>
//图形制造厂商的新特性,体现在glext.h中,有的尚未添加到gl.h中
//所以有
#include "glex.h"
//如果有权限放在/usr/include下就可以用<>了
//要使用GLUT实现窗口管理
#include<freeglut.h>
//其实这里面已经包含了gl.h和glu.h因此不需要再包含这两个了
-
1.6.2 OpenGL 实用工具库(GLUT) 10
glut是用来实现简化打开窗口、检测输入等任务。glut还包含一些复杂的三维物体的创建:球、圆环、茶壶。
窗口管理
glutInit()
//初始化
glutInitDisplayMode()
//一些显示模式的设定,RGBA or 颜色索引模式;单缓冲or双缓冲
glutInitWindowPosition()
//左上角位置
glutInitWindowSize()
//窗口大小(像素为单位)
glutInitContextVersion()
//声明使用的OpenGL版本
glutInitContextFlags()
//声明渲染环境类型
glutCreateWindow()
//创建一个窗口,返回一个标识符,在glutMainLoop中显示
显示回调函数
glutDisplayFunc()
//用于注册回调函数
glutMainLoop()
//调用已注册的显示回调函数
//所有已经创建的窗口会开始显示,渲染开始生效
//事件处理循环开始启动,已注册的显示回调函数被触发
//一旦进入,永不退出
处理输入事件
glutReshapeFunc()
//窗口大小改变
glutKeyboardFunc()
//键盘
glutMotionFunc()
//鼠标
glutIdleFunc()
//事件列表为空
-
第 2 章 状态管理和绘制几何物体 19
opengl中的曲线和曲面都是由点、平面多边形和直线构成的
opengl由两种绘图风格:立即模式和显示列表。立即模式:调用绘图函数时,立刻被绘制,这是默认的模式。显示列表:效率更高,先列出绘制清单,再一起绘制。
-
2.1 绘图工具箱 20
-
2.1.1 清除窗口 20
-
2.1.2 指定颜色 22
-
2.1.3 强制完成绘图操作 23
glFlush()
/*
CPU发出一条绘制命令,不需要等待其它硬件,
执行几何变换、裁剪、着色、纹理等操作执行完毕,
就可以继续发出下一个绘制命令
*/
-
2.1.4 坐标系统工具箱 24
这里讲的是glutReshapeFunc()函数中注册的回调函数,在移动窗口或者改变窗口大小的时候执行
-
2.2 描述点、直线和多边形 25
-
2.2.2 指定顶点 27
OpenGL的所有几何物体都被描述为一组有序的顶点
-
2.2.3 OpenGL 几何图元 27
-
2.3 基本状态管理 31
-
2.4 显示点、直线和多边形 32
-
2.5 法线向量 41
附录H中有寻找表面法向量的方法
-
2.6 顶点数组 43
-
2.6.1 步骤1:启用数组 44
-
2.6.2 步骤2:指定数组的数据 44
-
2.6.3 步骤3:解引用和渲染 46
-
2.6.4 重启图元 51
在init函数中使用,可以用glDrawelement代替glmultiDraw*
-
2.6.5 实例化绘制 53
-
2.6.6 混合数组 54
-
2.7 缓冲区对象 57
-
2.7.1 创建缓冲区对象 57
-
2.7.2 激活缓冲区对象 58
-
2.7.3 用数据分配和初始化缓冲区对象 58
-
2.7.4 更新缓冲区对象的数据值 60
-
2.7.5 在缓冲区对象之间复制数据 62
-
2.7.6 清除缓冲区对象 63
-
2.7.7 使用缓冲区对象存储顶点数组数据 63
-
2.8 顶点数组对象 65
-
2.9 属性组 69
-
2.10 创建多边形表面模型的一些提示 71
本节接下来的内容是讲怎么用三角面片绘制球。
-
第 3 章 视图 77
-
3.1 简介:用照相机打比方 78
-
3.1.1 一个简单的例子:绘制立方体 80
-
3.1.2 通用的变换函数 83
-
3.2 视图和模型变换 84
-
3.2.1 对变换进行思考 85
-
3.2.2 模型变换 86
-
3.2.3 视图变换 89
-
3.3 投影变换 93
-
3.3.1 透视投影 94
-
3.3.2 正投影 95
-
3.3.3 视景体裁剪 96
-
3.4 视口变换 96
-
3.4.1 定义视口 96
-
3.4.2 变换深度坐标 97
-
3.5 和变换相关的故障排除 98
-
3.6 操纵矩阵堆栈 100
-
3.6.1 模型视图矩阵堆栈 101
-
3.6.2 投影矩阵堆栈 102
-
3.7 其他裁剪平面 102
-
3.8 一些组合变换的例子 104
-
3.8.1 创建太阳系模型 104
-
3.8.2 创建机器人手臂 107
-
3.9 逆变换和模拟变换 109