计算机图形学是一个引人入胜的主题 。我们是如何将一些算法和几何数据转 变成《星球大战》(Star Wars)和《复仇者联盟》(the Avengers)等电影的特效,《玩具总 动员》(Toy Story)和《冰雪奇缘》(Frozen)等动画电影的特效 ,或者《堡垒之夜》 (Fortnite)和《使命召唤》(Call of Duty)等流行电子游戏的图像的呢?
计算机图形学也是一个非常广泛的主题 :从渲染三维(3-dimension,3D)场景 到创建图像滤波器 ,从数字排版到模拟粒子系统 ,有许多学科可以视为计算机图形 学的一部分 。一本书不可能涵盖所有主题 ,涵盖所有主题应该需要一个图书馆 。 《计算机图形学入门 3D渲染指南》专注于渲染 3D 场景这一主题 。
(1)简单明了的计算机图形学入门指南。
(2)只需具备基本编程知识和高中数学知识。
(3)专注于3D 渲染。本书将带领读者构建两个完整的、功能齐全的渲染器:光线追踪渲染器和光栅化渲染器。前者模拟在物体之间反弹时的光线,后者将3D 模型转换为2D 像素。
(4)全书给出众多的伪代码示例,使得读者可以轻松地用任何语言编写渲染器,还提供了可下载的实时JavaScript 演示代码,方便读者进一步探索。
本书的作者有着多年计算机图形学 教学经验 ,他将复杂的数学推导和算法实现以浅显易懂的方式讲述给读者 。本书是一本绝佳的入门教材 。
本书着重介绍光线追踪渲染器和光栅化渲染器这两大主流渲染器的基本实现 过程 ,以渲染器的需求背景和实现原理作为出发点 ,辅以必要的简单数学推导过 程 ,从光到阴影与反射 ,从直线到着色与纹理 ,逐渐引导出实现渲染器的伪代码 ,力 求使没有丰富编程经验和深厚数学功底的读者也能够完全读懂 。
本书是计算机图形学入门的学习教材 ,特别适合渴望进入计算机图形学世界 的“零基础”读者阅读 ,也适合对计算机图形学开发感兴趣的爱好者以及相关从业 人员使用 。
本书“从零开始”,构建两个完整的 、功能齐全的渲染器 :光线追踪渲染器和光 栅化渲染器 。尽管它们采用截然不同的方法 ,但是使用它们渲染简单场景时会产 生相似的结果 。 图 1 显示了两个渲染器的对比效果 。
图 1 一个简单的场景,分别由本书介绍的光线追踪渲染器(左图)和光栅化渲染器(右图)渲染得到
虽然光线追踪渲染器和光栅化渲染器有相当多的相同特性,但它们并不完全相同,本书将探讨它们的具体优势,我们在图2中可以看到其中一些。
图2 光线追踪渲染器和光栅化渲染器有其独特的功能 。 左图为光线追踪阴影和递归反射,右图为光栅化纹理
本书所有案例都有通俗易懂的伪代码 ,读者还可以通过异步社区获取完整的 实现代码(它们是用 JavaScript 编写的 ,可以直接在任何 Web 浏览器中运行)
本书适合任何对计算机图形学感兴趣的人阅读 ,无论你是一名高中生还是一 位经验丰富的专业人士 。
在书中对思路和算法的选择上,我有意识地选择简单明了的表述方式 。虽然书中算法是有行业标准的,但每当有不止一种方法可以实现某个结果时,我都会选择最 容易理解的那一种 。 同时,我也付出了相当大的努力来确保本书没有华而不实的东 西或者“耍花招”。我试着记住阿尔伯特 ·爱因斯坦的建议:“事情应该力求简单,不过不能过于简单。”
阅读本书不需要太多必备知识 ,也不需要依赖任何软件或硬件 。本书中唯一 需要使用的基元(primitive)是一个可以用来设置像素颜色的函数 ,这也与英文书名 中的“from Scratch”(从零开始)相吻合 。本书使用的算法在概念上很简单 ,涉及的数学知识也很简单——最多涉及一点点三角函数的知识 。我们还要使用一些线性代数的知识 。本书包含简短的附录 ,以非常实用的方式展示了我们阅读本书所需的一切线性代数知识 。
本书提供了编写软件渲染器所需的几乎所有知识 。本书没有使用现有的渲染接口(API,应用程序编程接口),如 OpenGL 、Vulkan 、Metal 或 DirectX 。
现代 GPU 的功能强大且无处不在 ,很少有人会有充分的理由去编写一个纯软件实现的渲染器 。但是 ,编写一个软件渲染器的经验是很有价值的 ,原因如下 。
本书总共 15 章 ,主要分为两个部分 ,第一部分(第 2 章~第 5 章)介绍光线追踪 (raytracing),第二部分(第 6 章~第 15 章)介绍光栅化(rasterization),这两部分也分 别对应我们将要构建的两个渲染器 。
第 1 章介绍理解这两部分内容所需的一些基础知识 。建议读者按照顺序阅读 这些章节 ,但是光线追踪和光栅化这两部分的内容都是完全独立的 ,读者也可以分 开阅读这两部分 。
以下是对每一章内容的概述 。
第 1章 基础入门概念 这一章我们介绍画布(canvas)的定义 ,它是一个抽象 的表面 ,我们将在其上进行图像绘制 。还介绍 PutPixel函数 ,它是我们可以在画 布上进行绘制的唯一工具 。我们也会带领读者学习颜色的表示方法和运算方法 。
第一部分 光线追踪
第2章 基础光线追踪知识 我们开发一个基础的光线追踪算法 ,能够渲染 一些看起来像彩色圆圈的球体 。
第3章 光 我们建立一个光与物体相互作用的模型,并对光线追踪渲染器进 行扩展,从而可以模拟光 。这样在第2章中我们渲染的球体看起来才像真正的球 。
第4章 阴影和反射 我们改善球体的渲染效果 :它们可以相互投射阴影 ,并 且可以有类似镜面的表面 ,那样我们就可以看到其他球体的反射效果 。
第5章 扩展光线追踪渲染器 我们简单介绍一些可以添加到光线追踪渲染 器中的附加功能 ,但是这些功能的细节超出了本书的范围 。
第二部分 光栅化
第6章 直线 我们从一块空白画布开始 ,开发一种算法来绘制线段 。
第 7 章 填充三角形 我们继续使用第 6 章的一些核心思想来开发一种算 法 ,用以绘制用单一颜色填充的三角形 。
第 8 章 角形 。
第9章 着色三角形 我们扩展第 7 章的算法 ,用平滑的颜色渐变填充三透视投影 我们需要从绘制二维(2-dimension,2D)图形中抽身出来学习一些几何和数学知识 ,我们需要用这些知识来将 3D点转换成2D点 ,这样就可 以将它们绘制在画布上了 。
第 10章 场景的描述和渲染 我们为场景中的物体开发一种表示方法 ,并探 索如何使用透视投影将它们绘制在画布上 。
第 11章 裁剪 我们开发一种算法来移除相机看不到的那部分场景 。现在 我们可以安全地从任何相机位置渲染场景 。
第 12章 移除隐藏表面 我们结合透视投影和着色三角形来渲染实体 ;为了 能够渲染出正确结果 ,我们需要确保远处的物体不会覆盖近处的物体 。
第 13 章 角形 。
第 14章 着色 我们将探索如何将第 3 章开发的光照方程应用于整个三纹理 我们开发一种算法 ,可以在我们的三角形上“绘制”图像 ,以此来伪造表面细节 。
第 15章 扩展光栅化渲染器 我们概述可以添加到光栅化渲染器的功能 ,但 这些功能的细节超出了本书的范围 。
附录 线性代数 我们介绍将在本书中使用的一些线性代数的基本概念 :点 、 向量和矩阵 。我们介绍可以使用它们完成的操作 ,并提供一些示例 ,以此说明我们可以使用它们做什么 。