三维图形硬件正迅速成为计算机系统不可或缺的一部分,而不仅仅是计算机系统的主要组成部分。许多操作系统直接使用甚至需要一定程度的 3D 渲染硬件。即使在日益重要的移动计算领域,3D 图形硬件也是除最低功耗设备之外所有设备的标准功能。

了解如何充分利用硬件是一项艰巨的挑战,特别是对于图形和渲染领域的新手来说。

为什么要读这本书?

有许多用于教授图形的实体书。还有更多的在线知识库,以 wiki、博客、教程和论坛的形式存在。那么这本书提供了什么其他书没有提供的内容呢?

可编程性。几乎所有上述资料都指导初学者使用所谓的“固定功能” 。这代表旧图形处理器中的配置,定义特定渲染操作将如何进行。通常认为,使用固定功能管道来教新手图形程序员最容易。

这是因为固定功能很容易让事情发生。制作看起来像真实事物的图片更简单。固定功能管道就像自行车的训练轮。

这种方法也有缺点。首先,当用户遇到必须用可编程性解决的图形问题时,用这种方法学到的大部分知识必须不可避免地被抛弃。可编程性几乎消除了所有固定功能管道,因此知识不易转移。

一个更隐蔽的问题是,固定功能管道会给人一种 知识丰富的 _ 错觉 _。用户可能认为他们明白自己在做什么,但实际上他们只是在复制粘贴代码。因此,编程变得类似于魔法仪式:你把某些代码放在其他代码之前,一切似乎都正常了。

这使得调试变得非常困难。由于用户从未真正理解代码的作用,因此用户无法诊断特定问题可能意味着什么。如果没有这种能力,调试就变成了对问题所在进行一系列随机猜测。

相比之下,如果不先了解可编程系统,就无法成功使用它。面对可​​编程图形硬件意味着面对固定功能材料经常掩盖的问题。这可能意味着总体上起步较慢,但当你最终到达终点时,你就会真正 _ 了解 _ 一切是如何运作的。

另一个问题是,即使你真正理解了固定功能管道,它也会限制你思考解决问题的方式。由于它缺乏灵活性,它会让你的思维集中在某些解决问题的可能性上,而忽略其他问题。它鼓励你将纹理视为图片;将顶点数据视为纹理坐标、颜色或位置;等等。从本质上讲,它限制了创造力和解决问题的能力。

最后,即使在移动系统上,图形硬件通常也不具备固定功能。可编程性是大多数图形硬件的当务之急,而且在未来只会变得更加现实。

本书提供的是初学者级别的指导,但很多人认为这是一个高级概念。它从零开始为初级图形程序员讲授可编程渲染。

本书还涵盖了一些经常被忽视或被归为“高级”概念的重要内容。这些概念并不是真正高级的,但它们经常被大多数入门材料忽略,因为它们不适用于固定功能管道。

本书首先是关于如何成为一名图形程序员。因此,只要可能且切实可行,本书将以一种鼓励读者以新颖有趣的方式研究图形硬件可以做什么的方式来呈现材料。优秀的图形程序员将图形硬件视为满足其需求的一套工具,本书试图鼓励这种思维。

然而,这本书并不是一本关于图形 API 的书。虽然它确实使用了 OpenGL,并且出于必要性,它以 OpenGL 的形式教授渲染概念,但它并不是 OpenGL API 的全面指南。它将涵盖各种图形概念所需的大部分 API,但 API 支持的许多功能将不会涉及。如果您已经了解图形,并且需要一本教授现代 OpenGL 编程的书,那么这本书可能对您来说太基础了。这本书将教您大部分 API,但这本书主要关注的是图形,而不是 API 本身。

本书旨在教您如何成为一名图形程序员。它不针对任何特定的图形领域;它旨在涵盖 3D 渲染的大部分基础知识。因此,如果您想成为游戏开发人员、CAD 程序设计师、从事计算机可视化或任何其他工作,本书仍然可以为您提供帮助。这并不意味着它涵盖了有关 3D 图形的所有内容。几乎不是。它试图为您在感兴趣的 3D 图形领域的进一步探索提供坚实的基础。

本书没有深入介绍的一个主题是优化。原因很简单,因为严肃的优化是一个高级主题。优化通常是特定于平台的,对于不同类型的硬件来说有所不同。它们也可以是特定于 API 的,因为某些 API 有不同的优化需求。优化可能到处都有提及,但对于初级图形程序员来说,这是一个太复杂的主题。附录中有一章介绍了优化机会,但它只提供了相当高层次的介绍。

你需要什么

这是一本面向初级图形程序员的书;对于熟悉基于固定功能的图形并希望更好地理解可编程渲染的人来说,它也可以作为一本很好的入门教材。

这本书并不是一本面向初级 _ 程序员 _ 的书。

您需要能够阅读 C 和合理的 C++ 代码。如果“ Hello, world! ”就是您 C/C++ 知识的极限,那么在尝试渲染图像之前,也许您应该编写一些更重要的代码。3D 图形渲染根本不是初学者的编程任务;这对于传统图形学习和现代图形学习同样如此。

这些教程也应该可以移植到其他语言。如果你能读懂 C/C++,那就足以理解代码的作用。解释代码作用的文字描述也足以从这些教程中获取信息。

任何关于 3D 渲染的实质性讨论都需要讨论数学,数学是所有 3D 图形的基础。本书要求您了解基本的几何和代数。本书将介绍图形所需的更高级数学。但您至少应该具备几何和代数的工作知识。线性代数不是必需的。

本书中的源代码使用 OpenGL 作为其渲染 API。开始时您不需要了解 OpenGL,但为了编译和运行任何此代码,您必须拥有允许 OpenGL 的开发环境。

具体来说,您需要能够运行 OpenGL 3.3 版的图形硬件。这意味着任何 GeForce 8xxx 或更高版本,或任何 Radeon HD 级显卡。这些也称为“ Direct3D 10 ”显卡,但您不需要 Windows Vista 或 7 即可通过 OpenGL 使用其高级功能。您应该安装最新版本的图形驱动程序,可在显卡制造商的主页上找到。除了驱动程序和实际的教程分发版之外,您不需要下载或安装任何其他东西来使用 OpenGL。

保持开放

本书旨在向图形程序员传授图形开发的基础知识。你能拥有的最重要的东西就是学习的意愿。这也意味着要抛弃先入为主的观念,最重要的是不要试图学习任何特定的东西。

程序员通常会在互联网上搜索或翻阅书籍,寻找有关如何执行某些特定任务的信息。一旦找到,他们就会尝试将该代码复制到他们的应用程序中,看看是否可以使其工作。这种方法可以更快地取得成果,但它专注于实现某个效果目标,而不是真正理解它的工作原理,从而削弱了学习能力。

第一次阅读这本书时,你应该尽量避免思考任何具体的问题。你可以把某个问题记在脑海里,但不要让寻找解决方案成为你阅读的动力。相反,你应该专注于书中呈现的内容。读完这本书后,你可以回头看看自己是否理解了如何解决你想解决的问题。

您可能会发现您有一个比您原本想到的更好的解决方案。

本书结构

本书分为多个一般主题。每个主题包含几个编号的章节,称为教程。每个教程都描述了几个相关概念。几乎在每种情况下,每个概念都通过一组配套代码进行演示。

每个教程都以概述将要讨论和演示的概念开始。每个教程的末尾都有一个回顾部分和该教程中介绍的所有术语的词汇表。回顾部分将解释教程中介绍的概念。它还将包含使用源代码本身的建议;这些建议旨在进一步理解这些概念。如果教程介绍了新的 OpenGL 函数或 OpenGL 着色语言的函数,它们也将在这里进行回顾。

这是一本面向初级图形程序员的书。图形是一个庞大的话题,没有一本书可以涵盖所有可能的效果、功能或技术。本书也不会详细介绍每种技术。有时,这些技术会在后续材料中重新讨论,但根本没有足够的空间来介绍所有内容。因此,当介绍某些技术时,最后会有一节对更高级的技术进行粗略的介绍。这将帮助您进一步研究图形编程,因为您将知道在网上或其他书籍中搜索什么。

每个教程最后都会附上该教程中定义的所有术语的词汇表。

本书中使用的约定

本书中的文本遵循一定的惯例。文本样式表示标记文本所代表的内容。

  • 定义术语:该术语将在每个教程末尾的词汇表中有一个定义。

  • FunctionNames:这些可以是 C、C++ 或 OpenGL 着色语言。

  • nameOfVariable:这些可以是 C、C++ 或 OpenGL 着色语言。

  • GL_ENUMERATORS

  • Names/Of/Paths/And/Files

  • K :键盘上的“ K ”键,与大写字母“ K ”不同**。后者是通过按 Shift** + K得到的。