Fundamentals Of Computer Graphics 第一章 介绍
介绍性的文字
这章主要是对计算机图形学的一些子领域以及通用概念进行了简要的介绍。
按照开篇的第一句话,所谓计算机图形学,大概就是用电脑来生成和操作图像的一门手艺,就算是模拟,也可以被理解成生成贴合现实的图像与动画(暴论)。
说到计算机图形学,就不得不提一嘴一些著名的图形API,比如DirectX的图形部分、OpenGL、Vulkan什么的,但是这本书不会主要讲这些东西,只是在很靠后的章节提了一下OpenGL。毕竟这是一本讲原理的书。不过图形学的术语基本通用,所以迁移的话应该比较简单。
图形学的领域
核心领域
建模:研究形状和外观属性在计算机里的存储方式。一个例子是只把马克杯用顶点的方式存储,然后定义一些插值规则和反射模型来生成立体图形。
渲染:对3D模型进行着色,生成图像。
动画:动起来,但在时域中会产生新的问题。
其他
这本书还提到了用户交互、VR、可视化、图像处理、3D扫描、计算摄影等话题。
用户交互:研究输入设备的接口、程序界面和对用户在视觉等方面的反馈。
图像处理:处理2D图像,在图形和CV领域都有应用。
主要应用
游戏、动画、特效、电影、CAD/CAM、模拟、医学影像学、信息可视化等
图形API
有些方便的API是平台无关的,另一些是平台相关的。
图形管线
拿来快速绘制3D图元的软件或硬件系统,对于共享顶点的三角形有特殊加速。图形管线把3D顶点数据投影到2D平面上,然后进行着色,还要考虑前后顺序,使用Z-缓冲解决图元的前后顺序问题。
除了传统的三个几何坐标之外,我们还用齐次坐标去解决平移问题(见Transformation那章)。
当模型在远处的时候,可以用LOD技术降低模型的分辨率,这样可以减少三角面元的数量,提升速度。
⭐数值上的问题
多亏了伟大的IEEE(×),浮点数的标准被统一了。IEEE的浮点数标准里有$\infty$,$-\infty$和$\mathrm{NaN}$三个新的符号,其中$\mathrm{NaN}$用来表示像0/0这样的未定义操作的结果。这三种符号的相互运算都是符合直觉的,引入这些符号可以使一些公式没有平凡的无定义情况。
效率
效率总是由权衡得来的,而且架构不同,优化方法也不一样。访存优化在优化中的地位比较高。
书里给出了先写出最直白的代码,再找关键路径进行优化的方法论,还提醒我们要相信编译器,很多“优化”只是让代码看起来更厉害,所以最好善用profiling。
⭐图形学程序的设计和编码
类设计
2/3/4维矢量、RGB颜色、变换矩阵、图像。有时将点与矢量分开,可以在提高可读性的同时把部分debug任务转交给编译器。
也可以设计区间、正交基、标架等类,总之方便就好。
Float or Double?
为了降低内存占用,提升访存一致性,可以用单精度数据,但是用双精度可以避免某些数值上的问题(?),这里也需要做权衡,但在程序内最好保持一致。书中给出了一个对于几何操作使用双精度,颜色使用单精度,顶点数据等大数据存储时使用单精度,运算时使用双精度的方案,同时又提议在遇到问题不得不用双精度之前一直用单精度。
图形程序的调试
图形程序涉及大量重复操作,从调试器里定位很麻烦,解释数据也很麻烦。
一些调试策略
科学方法
观察问题→提出假说→验证假说
用图像作为调试输出
直接把想观察的值输出成一幅图像。比如用颜色表示某点法向量的坐标、物体ID、绘制物体所用时间、超出范围的某些数值等。也可以把数据格式化然后输出,这样就可以放到Matlab之类的工具里了。
调试器
插入条件断点,比如在渲染某个像素时才中断。