Ch01
引言
计算机图形学(Computer Graphics)是利用计算机技术创建和处理图像的理论、方法和技术。
1.1 图形学领域
- 建模:对形状和外观性质进行数学定义,并且能够存储在计算机中。
- 绘制(Rendering):根据三维计算机模型生成带阴影的图像。
- 动画:利用图像序列,产生物体运动的视觉效果的一种技术。
- 人机交互:在输入设备、应用程序和以图形或者其他感官方式向用户改善的反馈之间建立接口。
- 虚拟现实:试图让用户转向于三维虚拟世界
- 可视化:试图通过视觉显示让用户看得更加明白
- 图像处理:对二维图像进行处理
- 三维扫描:利用测距技术建立三比邻 测量模型
1.2 主要应用
- 视频游戏:复杂的三维模型和绘制算法
- 动画片:根据三比邻 模型生成
- 电影特效:使用数字合成技术
- CAD/CAM:计算机辅助设计与计算机辅助制造。利用计算机技术在计算机内设计零件和产品,然后用这些虚拟设计指导生产过程
- 仿真:精确的视频游戏
- 医学成像:根据病人的检查数据创建有意义的图像
- 信息可视化:将数据以图像的方式显示出来
1.3 图形学 API
应用程序接口(API):是一种软件接口,为应用程序访问系统功能提供了一种模型。
- 多数 API 都具有使用 回调(callback)的用户界面工具包。回调:指通过函数指针或者虚函数向低层函数传递参数的过程。
当前主要的两种 API 模式:
- Java 的集成方法:图形与用户界面工具包被集成在一起,而且都是可以移植的包,包是完全标准化的,并且作为语言的 一部分得到支持
- Direct3D和OpenGL:画图命令是软件库的一部分,软件库与某种语言绑定(C++、Python),而且用户界面软件是独立的实体,随着系统的不同而不同。
- 不方便编写可移植的代码
1.4 三维几何模型
一般的三维几何模型:球、立方体、圆锥、多边形等基本数学形状。最常用的模型由三维三角形组成,这些三角形共享顶点,常被称作三角形网格。
1.5 图形流水线
三维图形流水线(Graphic Pipline):是特别的软硬件子系统,能够高效给出透视图中的三维图元。
流水线的基本运算是把三维顶点位置映射到二维屏幕位置,并且对三角形进行明暗处理,使它们看起来比较真实,并且按照适当的前后层次显示。
前后层次绘制三角形的常用方法:通过 Z 缓冲器技术解决,利用特殊的存储缓冲区解决了蛮力算法中存在的问题
图形流水线中的几何运算,可以在四维坐标空间中实现。四维坐标由一般的三维几何坐标和利于处理透视问题的第4维齐次坐标组成。这些四维坐标主要用于 $4\times 4$ 的矩阵和四维向量。因此图形流水线中包含很多对矩阵和向量进行高效处理和组合运算的机制。
在表示模型时要采用不同的细节等级(LOD)。
1.6 数值问题
IEEE浮点标准(IEEE Standardss Association, 1985)中的三个「特殊值」:
- 无穷大($\infty$):比任何其他有效数都大的有效数
- 负无穷大($-\infty$):比任何其他有效数都小的有效数
- 无效数(NaN):由结果未定义的运算得到,例如:$0/0$
常用的计算公式:
$$
\begin{align*}
\infty+\infty&=+\infty\
\infty-\infty&=\text{NaN}\
\infty\times\infty&=\infty\
\infty/\infty&=\text{NaN}\
\infty/a&=\infty\
\infty/0&=\infty\
0/0&=\text{NaN}\
+a/+0&=+\infty, a>0\
-a/+0&=-\infty, a>0
\end{align*}
$$
布尔表达式规则:
- 所有有限的有效数都小于 $+\infty$
- 所有有限的有效数都大于 $-\infty$
- $-\infty$ 小于 $+\infty$
- 任何包含 NaN 的算术表达式,结果都是 NaN
- 任何包含 NaN 的布尔表达式,结果都为假
1.7 效率
效率是对各个方面进行认真权衡后得到的,而权衡的标准随着系统体系结构的不同而不同。
优化的步骤:
- 以最直接的方式编写代码,尽量直接计算数据而不存储它
- 在优化模式下编译
- 使用性能分析软件找到系统瓶颈
- 检查数据结构,找出调整数据位置的方法
- 重写源代码解决性能分析时发现的问题
1.8 软件工程
图形程序的关键是针对几何实体(向量和矩阵)、图形实体(RGB颜色和图像)都具有较好的类和例程。常见的基本类:
- vector2:二维向量类,存储了x和y分量。将这些分量庆长度为 2 的数组中,以支持索引操作。同时还支持向量加法、向量减法、点积、叉积、标量乘法和标量除法
- vector3:三维向量类,类似于vector2
- hvector:四维向量类,包含了四个分量的齐次向量(参考:Ch07)
- rgb:包含了三个分量的 RGB 颜色。同时还支持 RGB 加法、RGB 减法、RGB 乘法、标量乘法和标量除法
- transform:$4\times 4$ 变换矩阵。同时还支持矩阵乘法,以及求位置、方向和表面法向量的成员函数(参考:Ch06)
- image:由 RGB 像素构成的二维阵列,带一个输出操作
1.8.1 单精度和双精度
减少内存使用,并且保持一致的内存存取是提高效率的关键。
- 几何运算使用双精度类型
- 颜色运算使用单精度类型
1.8.2 内联
内联是实用类(如 RGB)提高效率的关键。
1.8.3 成员函数与非成员运算符
复杂的大数据量计算建议声明在类的外部,定义这种运算时,代码越简洁越好。参数传递尽量使用 const 引用形式。
1.8.4 包含保护符
所有类声明都应该具有包含保护符(include guard)。
1.8.5 编译调试
在代码中应该包含很多断言(assert)宏。
1.8.6 实验性调试
最难发现的错误都是概念上的错误,即实现的目标错了。