本节书摘来自异步社区《OpenGL超级宝典(第5版)》一书中的第1章,第1.2节3D图形技术和术语,作者 【美】Richard S. Wright , Jr.Nicholas Haemel,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.2 3D图形技术和术语
本书的每一章都包含一个或多个示例程序用来演示这一章所讨论的编程技术。尽管本章有意避免了关于编程细节的讨论,但仍提供了一个示例程序向读者演示最低程度上需要熟悉的技术和术语,以帮助读者充分地利用本书。本章的示例程序叫做BLOCK,读者可以从随书提供的示例程序集中的“Chapter 1”文件夹中找到它。
将数学和图形数据转换成3D空间图像的操作叫做渲染(Rendering)。当这个术语作为动词使用时,指的是计算机创建三维图像时所经历的过程。它也作为名词使用,指的仅仅是最终的图像作品。这个术语在本书中会经常出现。现在我们来看一看渲染过程中出现的其他一些属于和操作。
1.2.1 变换(Transformation)和投影(Projection)
图1.4所示是BLOCK示例程序的原始输出结果,显示的是用线条绘制的一个放置在一张桌子或一个平面上的立方体。通过变换(Transformation),或者说旋转这些点,并在它们之间绘制线段,我们就能在平面的2D屏幕上创造出一个3D世界的错觉。早期的飞行模拟器所使用的技术不过如此。
图1.4 一个简单的线框立方体和桌子
这些点本身叫做顶点(Vertices,单数为Vertex),它们能够通过一种称为变换矩阵(Transformation Matrix)的数学结构进行旋转(本书第4章将详细讲解变换矩阵相关内容)。另外还有一种矩阵叫做投影矩阵(Projection Matrix),用于将3D坐标转换成二维屏幕坐标,实际的线条也将在二维屏幕坐标上进行绘制。
1.2.2 光栅化(Rasterization)
实际绘制或填充每个定点之间的像素形成线段就叫做光栅化(Rasterization)。我们可以通过隐藏表面消除(Hidden Surface Removal)来进一步澄清3D设计意图。图1.5所示显示了在BLOCK示例程序第一次按空格键后的输出。虽然使用的仍然是点和线段,但是一个放置在桌面上的正方体的错觉却更加逼真了。
图1.5 隐藏固体几何体的背面能够加强3D错觉
虽然用线段绘图【也称做线框渲染(Wireframe Rendering)】也有它的用处,但在大多数情况下我们并不是用线段,而是用实心三角形进行渲染。像线段一样,三角形和多边形也会被光栅化或填充。早期的图形硬件能够用纯色对三角形进行填充,但正如图1.6所示的那样,这样做并不能增强3D错觉。早期的游戏和模拟技术可能会在相邻的多边形上采用不同的纯色,这确实有所帮助,但却不能令人信服地对现实进行模拟。
图1.6 使用纯色对几何图形进行填充的方法几乎没什么效果
1.2.3 着色
在图1.7(在运行BLOCK示例程序时再次按空格键)中展示了着色(Shading)的效果。通过沿着表面(在顶点之间)改变颜色值,能够轻松创建光线照射在一个红色立方体上的效果。
图1.7 对表面进行着色能够创建光照错觉
光照和着色在3D图形专业领域占据了非常大的比重,并且有专门论述它们的书籍。另一方面,着色器(Shader)则是在图形硬件上执行的单独程序,用来处理顶点和执行光栅化任务。
1.2.4 纹理贴图
接下来要介绍的硬件技术进步是纹理贴图(Texture Mapping)。一个纹理不过是一幅用来贴到三角形或多边形上的图片。正如我们在图1.8中看到的,这些纹理将渲染提高到了一个崭新的层次。
图1.8 一个纹理堪比上千个三角形
在如今的硬件上,纹理是快捷有效的,而一个纹理所能再现的表面如果用三角形来实现的话,可能需要几千甚至几百万个。
1.2.5 混合
最后,图1.9所示展示了混合(Blending)的效果。混合时我们能够将不同的颜色混在一起。我们首先上下颠倒地绘制这个立方体,然后再在它上面绘制地板并与它进行混合,在绘制正常方向的立方体,就能获得这种反射效果。我们确实“透过”地板看到了下面颠倒的立方体。大脑告诉我们,“哦……这是个倒影”。我们也可以应用混合使物体看起来透明。实际上,在图1.9中真正看到的倒立立方体其实是“透过”地板看到的。
图1.9 使用混合来创建反射效果
1.2.6 将点连接起来
总而言之,上述内容大概就是所谓的计算机图形了。实心3D几何体无非是将顶点间的点连接起来,然后对三角形进行光栅化而使对象变得有实体。变换、着色、纹理与混合——我们在电影、电视游戏、医疗或商业应用中看到的任何计算机渲染场景都无非是灵活地运用这4种技术而产生的。