《Fundamentals of Computer Grahpics 4ed》虎书第四版翻译——第一章 介绍


计算机图形学描述了使用计算机创建和处理图像的任何方式。本书从算法层面和数学层面介绍了创捷各种图像的所需知识,如:逼真的视觉效果,内容丰富的技术插图或精美的计算机动画。图像可以是二维或者三维的;图片可以是完全合成的,也可以是通过处理照片生成的。这本书是关于图形学基础算法和数学知识的,尤其侧重于生成三维物体和场景的合成图像。

任何关于计算机图形的工作都不可避免地要求特定硬件,文件格式,图形API(见1.3节)的相关知识。计算机图形学是个不断发展的领域,所以这部分的知识也在与时俱进。因此,这本书我们将尽最大努力避免过分依赖特定硬件或API。鼓励读者在其软硬件项目中自行添加这部分的代码和文档。幸运的是,在计算机图形学的发展历程中已经形成了足够的标准术语和概念,本书讨论的知识可以很方便地应用到大多数的环境中。

这章定义了一些基本术语,并且介绍了一些关于图形学的历史背景和资源信息。

1.1 图形学领域

对任何领域强制划分类别都是危险的,但大多数的图形学工作者都会同意对计算机图形学的以下划分:

  • 建模:以可以存储在计算机上的方式处理形状和外观属性的数学规范。 例如,一个咖啡杯可能被描述为一组有序的3D点以及一些连接点的插值规则和一个反射模型,该反射模型描述了光如何与杯子相互作用。
  • 渲染:是从艺术继承的术语,涉及从3D计算机模型创建阴影图像。
  • 动画:是一种通过图像序列创建运动幻觉的技术。 动画使用建模和渲染,但是增加了随时间推移运动的关键部分,而基本建模和渲染通常不会解决这一问题。

还有很多其他与计算机图形学相关的领域,但它们是否也属于图形学的核心领域也就见仁见智了。这些都将在文本中涉及。 这些相关领域包括:

  • 用户交互:处理鼠标和平板电脑等输入设备之间的接口,例如应用程序,图像中对用户的反馈以及其他传感器反馈。 从历史上看,该领域与图形相关联,因为图形研究人员最早可以访问现在无处不在的输入/输出设备。
  • 虚拟现实:尝试使户沉浸在3D虚拟世界中。 通常,这至少需要立体图形和对头部运动的响应。 对于真实的虚拟现实,还应该提供声音和力量反馈。 因为此区域需要高级3D图形和高级显示技术,所以它通常与图形密切相关。
  • 可视化:尝试通过视觉显示使用户洞悉复杂信息。 通常在可视化问题中要解决图形问题。
  • 图像处理:处理2D图像的操作,并用于图形和视觉领域。
  • 3D扫描:使用测距技术来创建可测量的3D模型,此类模型可用于创建丰富的视觉图像,并且此类模型的处理通常需要图形算法。
  • 计算摄影:是使用计算机图形,计算机视觉和图像处理方法来实现以照相方式捕获对象,场景和环境的新方法。

1.2 主要应用

基本上所有行业都多多少少涉及计算机图形学,但主要的应用还是集中在以下这些行业:

  • 视频游戏
  • 卡通动画
  • 视觉特效
  • 动画电影
  • CAD/CAM
  • 仿真
  • 医疗影像
  • 信息可视化

1.3 图形学API

使用图形库的关键部分是API的使用。API是一系列相关功能操作的标准接口,图形学API是实现例如图像绘制和显示图像的一些列函数。

所有的图形程序需要使用两种相关API:图像API,负责视觉输出;用户输入API,负责从用户获得输入。目前有图像和用户API的两种主要模式。第一种是集成方法,以Java为例,图像和用户工具集是集成便携的包,并被语言完全支持。第二种由Direct3D和OpenGL代表,绘制命令是软件库的一部分,并由C++等相关语言实现,用户输入是另外独立的一部分,不同系统的实现可能也会有细微差别。在后一种情况中,尽管对于简单的程序,可以使用可移植的库层来封装系统特定的用户界面代码,但编写便携的代码还是可能会产生问题。

不管你选择何种API,基本的图形调用方法大体都是相似的,这本书的内容也都会适用。

1.4 图形管线

今天的每一台桌面电脑都拥有强大的 3D图形管线 。这是一种高效绘制3D图元的软硬件子系统。通常,这些系统会针对处理拥有共同顶点的3D三角形进行专门优化。管线可以映射3D顶点位置到2D屏幕位置,为三角形添加阴影,以使它们看起来逼真,并且以适当的前后顺序显示它们。

虽然以实际的前后顺序绘制三角形一度是计算机图形学最重要的研究点,但现在使用z-buffer就可以很好地解决。z-buffer使用一块特殊的内存,以暴利方式解决了这个问题。

事实证明,图形管线中使用的几何操作几乎可以完全在4D坐标空间中完成,该空间由三个传统的几何坐标和第四个有助于视图透视的齐次坐标组成。这些4D坐标使用4x4的矩阵和4维向量进行操作。因此,图形管线包含很多可以高效处理和组合这些矩阵和向量的机制。这些4D坐标系是计算机科学中使用的最微妙,最精美的构造之一,并且无疑是学习计算机图形学时最大的智力障碍。每本图形学相关书籍都会花很大的部分介绍这部分内容。

图片产生的速度很大程度上依赖要绘制的三角形的数量。由于在很多应用中,交互比视觉效果更加重要,因此减少模型的三角形数量以获得更高的显示速度是值得的。此外,从远处观察模型比从近处观察模型需要更少的三角形。这说明使用LOD(level of detail) 展示模型很有必要。

1.5 数值问题

1.6 效率

提高代码运行效率并没有什么秘诀。效率要经过仔细的权衡,不同的架构师会有不同的考虑。因此,在可见的未来,一个很好的启发是程序员应该更多地注意内存访问模式而不是操作计数。这与二十年前的最佳启发恰恰相反。之所以发生此切换,是因为内存的速度无法跟上处理器的速度。由于这种趋势还在继续,有限和一致的内存访问对于优化的重要性应该只会增加。

一种合理的提高代码速度方法是按照下面步骤且仅取需要的执行:

  1. 以最直观的方式编写代码。根据需要即时计算中间结果,而不是存储它们。
  2. 以优化模式编译;
  3. 使用现有的任何概要分析工具来查找关键瓶颈;
  4. 检查数据结构以寻找改善位置的方法。如果可能,使数据单元大小与目标体系结构上的缓存/页面大小匹配;
  5. 如果分析揭示了数值计算中的瓶颈,请检查编译器生成的汇编代码是否存在效率低下的情况。 重写源代码以解决您发现的任何问题。

这种步骤最重要的是第一步。大多数的“优化”没有提高速度却使代码变得更加难读。此外,在前期优化上多花时间好过之后的修复Bug和添加特性。另外,要提防旧的经验;一些经典的方式,比如使用整数类型替代实数不会再提升速度,因为现在的CPU执行整数操作并不一定比执行浮点数操作慢。一般情况下,针对特定机器和编译器的优化都是需要细致分析的。

1.7 设计和编写图形程序

某些通用策略通常在图形编程中很有用。 在本节中,我们提供一些建议,在您实施本书中学习的方法时可能会有所帮助。

1.7.1 类设计

任何图形程序的关键部分都是为诸如矢量和矩阵之类的几何实体以及诸如RGB颜色和图像之类的图形实体提供良好的类或例程。这些类应该被设计得尽量简洁高效。一个通用的设计问题是,位置和位移是否应该是单独的类,因为它们具有不同的操作,例如,位置乘以二分之一没有几何意义,而位移的二分之一却有意义。在这个问题上几乎没有共识,这可能会激起图形从业者数小时的激烈辩论,但是为了举例说明,我们假设我们不会对此加以区分。

这意味着要编写的一些基本类包括:

  • vector2
  • vector3
  • hvector
  • rgb
  • transform
  • image

另外,您可能希望也可能不想添加区间,正交基准和坐标系的类。

1.7.2 Float还是Double

现代体系结构表明,减少内存使用并保持一致的内存访问是提高效率的关键。 这建议使用单精度数据。 但是,要避免数值问题,建议使用双精度算法。权衡取决于程序,但最好在类定义中有默认值的选择。

1.7.3 调试图形程序

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页