参考的翻译:https://github.com/NWPU66/Fundamentals-Of-Computer-Graphics-5th-CN
图形学的领域
- 建模(Modeling):处理形状的数学规范和外观属性
- 渲染(Rendering):从 3D 计算机模型构建着色后的图像(shaded image)
- 动画(Animation):通过一系列图像创造正在运动的幻觉,包括建模和渲染,但是增加了“运动”这一问题
- 用户交互(User interaction):通过输入输出设备接口,以图像形式给予用户反馈
- 虚拟现实(Virtual reality):让用户沉浸在 3D 虚拟世界中,提供立体图形和头部运动的响应,更进一步提供声音和力的反馈,需要先进的图形显示技术
- 可视化(Visualization):通过视觉让用户洞察复杂信息
- 图像处理(Image processing):二维图像的处理
- 三维扫描(Three-dimensional scanning):使用测距技术创建三维模型,模型的处理需要图形学算法
- 计算摄影(Computational photography):利用图形学、计算机视觉和图像处理方法来实现以新的方式捕捉物体、场景和环境
主要应用
- 游戏(Video games)
- 卡通动画(Cartoons)
- 视觉特效(Visual effects)
- 动画电影(Animated films)
- CAD/CAM:计算机辅助设计/计算机辅助制造,虚拟设计用来知道工业制造
- 模拟(Simulation):例如飞行模拟器
- 医学成像(Medical imaging):例如 CT
- 信息可视化(Information visualization):例如股票价格随时间的趋势
图形 API
包括输入和输出 API。
可以分为两种模式:
- 一种是集成工具,例如 Java,图形绘制和用户界面一起作为包的形式被完全标准化并成为语言的一部分
- 另一种以 OpenGL 和 Direct3D 为代表,仅仅是 3D 绘制库,与用户界面是独立的实体
图形管线
绘制 3D 图元的强大软硬件子系统,为处理有共享顶点的 3D 三角形做了优化。
基础操作即将 3D 顶点映射到 2D 屏幕上并且着色,并以适当的前后顺序显示
z-buffer 用来解决前后顺序问题
图形管线中使用的几何操作几乎完全由三个传统几何坐标和一个有助于透视的第四齐次坐标组成的 4D 坐标空间中完成,可以表示成 4 乘 4 的矩阵和 4 维向量,4D 坐标系是计算机科学中最微妙、最美丽的构造之一
细节层次(Level of Detail)用来平衡图元数目和效率
数学议题
IEEE 浮点数标准
正无穷($\infty$)、负无穷($-\infty$)、NaN(Not a number)
- $\infty/\infty=\text{NaN}$、$0/0=\text{NaN}$、$\infty-\infty=\text{NaN}$
- $-a/\infty=-0$、$+a/+0=+\infty$
效率
效率通过仔细的权衡(tradeoff)来实现,而 tradeoff 在不同的结构上不同
由于内存的速度没跟上处理器的速度,优化方向由“操作数量”转变到“内存访问模式”
提高效率的方法:
- 写更直接的代码,不要存储中间结果而是实时计算
- 以最优化的方式编译
- 使用现有工具找到瓶颈
- 检查数据结构,找到局部提升性能的方法,如果可能的话让数据单元的大小与内存或者缓存分页的大小一致
- 如果数值计算存在瓶颈,那么检查生成的汇编代码,以查找效率损失,然后重写
整数代替浮点数不一定能够提升性能
大多数“优化”只会让代码更难读,不要过度设计
KISS (Keep It Simple, Stupid)
设计和编写图形程序
类
类的设计很重要,一些基本的类:
vector2
:2D 向量,需要支持向量的加减、点乘、叉乘、数乘vector3
:3D 向量,与 2D 向量相似hvector
:齐次向量,有 4 个部分rgb
:RGB 颜色,三个部分,需要支持加减、点乘、数乘transform
:4 乘 4 的方阵,需要支持矩阵乘法,可以应用位置、方向、表面法向量image
:RGB 像素的二维矩阵
除此之外,还有区间、正交基、坐标系的类
双精度还是单精度
降低内存使用率和保持一致的内存访问是提高效率的关键,建议单精度,但是为了避免数值问题需要权衡
调试
发现问题后,提出想法,然后验证想法,缩小范围
输出法:输出图像的 RGB 值来判断错误
陷阱法:如果出错那么输出一些醒目的标志
使用调试器的条件断点
断言
调试数据可视化