《Computer Graphics From Scratch》《从零开始的计算机图形学》
计算机图形学是一个引人入胜的话题。你如何从几个算法和一些几何数据的特殊效果
适用于《星球大战》和《复仇者联盟》等电影、《玩具总动员》和《冰雪奇缘》等动画电影或图形流行的电子游戏,如《堡垒之夜》或《使命召唤》?
计算机图形学也是一个可怕的广泛话题:从渲染3D场景创建图像过滤器,从数字排版到模拟粒子系统,有很多学科可以考虑作为计算机图形学的一部分。 一本书不可能涵盖所有这些科目; 它需要一个图书馆。 本书只关注渲染 3D 场景的主题。
《从零开始的计算机图形学》是我谦逊的尝试,以一种可访问的方式呈现这一部分计算机图形。 它的编写目的是为了让高中生容易理解,同时对专业工程师保持足够的严谨性。 它涵盖了与完整的大学课程相同的主题——事实上,它是基于我在大学教授这门学科的多年经验。
这本书适合任何对计算机图形学感兴趣的人,从高中生到经验丰富的专业人士。
我已经有意识地选择在演示文稿中支持简单性和清晰性。 这反映在书中思想和算法的选择上。 虽然算法是行业标准的,但不止一种方法可以达到某个结果,我就会选择最容易理解的一种。 与此同时,我付出了相当大的努力来确保没有挥手或诡计。 我试着记住阿尔伯特·爱因斯坦的建议:“一切都应该尽可能简单,但不能简单。”
本书几乎没有必备知识,也没有硬件或软件依赖项。 本书中唯一使用的原语是一种让我们设置像素颜色的方法——尽可能接近从头开始。 这些算法在概念上很简单,在数学上也很简单——最多只是一点点高中三角学。 我们还使用了一些线性代数,但本书包含一个简短的附录,以非常实用的方式展示了我们需要的一切。
本书从头开始,构建了两个完整的、功能齐全的渲染器:一个光线追踪器和一个光栅器。 尽管它们遵循非常不同的方法,但在用于渲染简单场景时会产生相似的结果。如图1:
图 1:由本书开发的光线追踪器(左)和光栅器(右)渲染的简单场景。
虽然光线追踪器和光栅器的功能有相当大的重叠,但它们并不完全相同,本书探讨了它们的具体优势,其中一些可以在下图2中看到。
图 2:光线追踪器和光栅器有它们自己独特的特征。 左:光线追踪阴影和递归反射; 右:光栅化纹理。
本书通篇提供了非正式的伪代码,以及作为用 JavaScript 编写的完整工作实现的链接,可以直接在任何 Web 浏览器中运行。
这本书应该为您提供编写软件渲染器所需的所有知识。 它不会使用或教您如何使用现有的渲染 API,例如 OpenGL、Vulkan、Metal 或 DirectX。
现代 GPU 功能强大且无处不在,很少有人有充分的理由编写纯软件渲染器。 但是,由于以下原因,编写一个纯软件渲染器的经验很有价值:
着色器是软件。 首先 ,1990 年代初期的第一个古老的 GPU 直接在硬件中实现了它们的渲染算法,因此您可以使用它们但不能修改它们(这就是为什么 1990 年代中期的大多数游戏看起来如此相似)。 今天,您编写自己的渲染算法(在本文中称为着色器),它们在 GPU 的专用芯片中运行。
知识就是力量。 了解不同渲染技术背后的理论,而不是复制和粘贴半理解的代码片段或大量流行的方法,可以让您编写更好的着色器和渲染管道。
图形学很有趣。 很少有计算机科学领域能提供计算机图形学提供的那种即时满足感。 当您的 SQL 查询运行得当时,您所获得的成就感与您第一次正确地进行光线跟踪反射时的感觉相比是完全不同的。 我在大学教了五年的计算机图形学,我经常想知道为什么我这么长时间地一个学期又一个学期地教同样的东西; 最后,值得的是看到我学生的脸亮了起来,看到他们使用他们的第一个渲染场景作为桌面背景。
本书分为 光线追踪 和 光栅化 两部分,分别对应我们要构建的两个渲染。
第一章介绍了理解这两部分所必需的一些基本知识。 我建议您按顺序阅读这些章节,但本书的两个部分都足够独立,可以大部分独立阅读。
以下是您将在每章中找到的内容的简要概述。
第 1 章:介绍性概念 。我们定义了画布,我们将在其上绘制的抽象表面,以及 PutPixel,我们在其上绘制的唯一工具。 我们还学习表示和操纵颜色。
第一部分:光线追踪
第 2 章:基本光线追踪。 我们开发了一种基本的光线追踪算法,能够渲染一些看起来像彩色圆圈的球体。
第 3 章:光照。 我们建立了一个光与物体相互作用的模型,并扩展了光线追踪器来模拟光。 球体现在看起来像球体。
第 4 章:阴影和反射。 我们改进了球体的外观:它们相互投射阴影,并且可以具有镜面般的表面,我们可以看到其他球体的反射。
第 5 章:扩展光线追踪器。 我们概述了可以添加到光线追踪器中的其他功能,但这些功能超出了本书的范围。
第二部分:光栅化
第 6 章:线条。 我们从一个空白画布开始,开发一个算法来绘制线段。
第 7 章:实心三角形。我们重用上一章中的一些核心思想来开发一种算法来绘制用单一颜色填充的三角形。
第 8 章:阴影三角形。我们扩展了上一章的算法,用平滑的颜色渐变填充我们的三角形。
第 9 章:透视投影。我们从绘制 2D 形状中稍做休息,看看我们需要将 3D 点转换为可以在画布上绘制的 2D 点的几何和数学。
第 10 章:描述和渲染场景。我们为场景中的对象开发了一种表示,并探索了如何使用透视投影在画布上绘制它们。
第 11 章:剪辑。我们开发了一种算法来移除相机看不到的场景部分。现在我们可以从任何摄像机位置安全地渲染场景。
第 12 章:隐藏表面去除。我们结合透视投影和阴影三角形来渲染实体对象; 为了使其正常工作,我们需要确保远处的物体不会覆盖更近的物体。
第 13 章:阴影。我们探索如何将第 3 章中开发的光照方程应用于整个三角形。
第 14 章:纹理。我们开发了一种算法来在我们的三角形上“绘制”图像,以此来伪造表面细节。
第 15 章:扩展光栅化器。我们概述了可以添加到光栅化器中的功能,但这些功能超出了本书的范围。
附录:线性代数。我们介绍了本书中使用的线性代数的基本概念:点、向量和矩阵。 我们展示了我们可以使用它们进行的操作,并提供了一些我们可以使用它们的示例。
Computer Graphics From Scratch本章介绍《从零开始的计算机图形学》的简介以及这本书的每章中内容的简要概述。