计算机图形学教程
计算机图形学简化了在计算机屏幕上显示任何尺寸图片的过程。各种算法和技术用于在计算机中生成图形。本教程将帮助您了解计算机如何处理所有这些图形,从而为用户提供丰富的视觉体验。
什么是计算机图形学?
计算机图形学是计算领域的一个动态领域,它涉及使用计算机创建、操作和渲染视觉内容。它包括数字图像、动画和交互式图形,用于娱乐、教育、科学可视化和虚拟现实等各个领域。
计算机图形学可用于UI设计、渲染、几何对象和动画。它指的是以图形方式操作和表示图像或数据,需要各种技术进行创建和操作,以及数字合成及其操作。
谁应该学习计算机图形学?
本计算机图形学教程是为不知道图形如何在计算机中使用的学生准备的。它解释了图形基础知识以及如何在计算机中实现它们以生成各种视觉效果。
学习计算机图形学的先决条件
在开始本教程之前,我们假设您已经了解C编程语言和基本数学的基本概念。
关于计算机图形学的常见问题
关于计算机图形学有一些非常常见的问题 (FAQ),本节试图简要地回答它们。
1. 光栅图形和矢量图形有什么区别?
光栅图形和矢量图形是两种常见的数字图像类型。
光栅图形由微小的像素组成;它们非常适合照片等细节丰富且色彩鲜艳的图像。另一方面,矢量图形使用数学路径来表示徽标和插图等缩放设计。
光栅图像使用位图存储信息,较大的文件需要更大的位图。另一方面,矢量图形使用顺序命令或数学语句在二维或三维环境中放置线条或形状。
2. 什么是像素,它与图像分辨率有什么关系?
像素源自术语“图像元素”,是数字图像的基本单位,表示视觉信息。它们由RGB子像素组成,这些子像素混合以创建不同的颜色。像素形成光栅图像,每个像素代表一个特定的位置和颜色值。
在一幅图像中,行和列中像素的数量表示分辨率。与像素数量较少的图像相比,像素数量较多的图像将更准确、更详细。
3. 计算机图形学中的渲染是什么?
术语渲染表示数据的可视化。在计算机图形学中,显示生成的图形就是渲染。但是我们通常将三维渲染与术语“渲染”一起使用。
三维渲染是一个基于计算机的过程,它从数字三维场景生成二维图像。它在建筑、产品设计、广告、视频游戏和视觉效果等各个行业都至关重要。
4. 有哪些不同类型的渲染技术?
下面列出了一些渲染技术:
- 扫描线是一种传统的渲染技术,用于计算计算机图形曲面。
- Z缓冲区是一个二维数据系统,用于深度计算和存储。
- 着色和光照使用软件效果来操纵光线和暗度级别。
- 纹理/凹凸贴图显示颜色、材质和对象细节。
- 光线追踪和光线投射是用于创建自然光照效果的有用渲染技术。
5. 什么是图形管道?
图形管道是计算机图形学中的一个框架,它概述了将三维场景转换为屏幕上二维表示的过程。它将模型转换为计算机显示器上可感知的视觉格式。
由于图形管道依赖于特定的软件、硬件配置和显示属性,因此不存在普遍适用的图形管道。相反,Direct3D、OpenGL和Vulkan等图形应用程序编程接口 (API) 标准化了常用过程并监督硬件加速器的图形管道。
6. 在图形的上下文中,CRT和LCD等显示设备是如何工作的?
CRT显示器使用电子束使屏幕上的磷光点发光。图像就是这样形成的。另一方面,LCD显示器使用液晶和背光来控制光线并形成图像。
两种类型都依赖于显卡来渲染和发送图像信号。CRT使用模拟信号,而LCD使用数字信号。为了正确显示,显卡和显示器必须支持相同的分辨率和刷新率。
7. 线性代数在计算机图形学中的作用是什么?
线性代数就像计算机图形学的数学工具包。它有助于在屏幕上创建和移动二维或三维对象。例如,它允许我们旋转、缩放和移动对象。可以把它想象成使视频游戏和动画看起来逼真的数学原理。
没有线性代数,就不可能创建图形。我们从线性方程中形成矩阵来解决实际问题。
8. 什么是帧缓冲区?
帧缓冲区是RAM中的内存缓冲区,其中包含驱动视频显示的位图。它表示完整视频帧中的所有像素,并将内存中的位图转换为视频信号,以便在计算机显示器上显示。
该缓冲区通常包含每个像素的颜色值,存储在1位二进制、4位调色板、8位调色板、16位高颜色和24位真彩色格式中。所需的总内存取决于输出信号分辨率和颜色深度。
9. 空间数据结构如何提高渲染效率?
网格、八叉树和BSP树等空间数据结构有助于组织场景中的三维对象。它们通过减少确定可见内容所需的计算量来加快渲染速度。
例如,系统无需检查每个对象,只需检查相关区域中的对象即可。这加快了光线追踪等过程,使图形更流畅、更高效。对于出现在其他对象前面或后面的对象,这些数据结构也大有帮助。
10. 颜色深度有什么意义?
颜色深度,也称为位深度,是用于指示单个像素的颜色或单个像素的每个颜色分量的位数。它可以定义为每像素位数 (bpp)、每分量位数、每通道位数、每颜色位数 (bpc)、每像素分量位数、每颜色通道位数或每样本位数 (bps)。
现代标准通常使用每分量位数,而历史上低深度系统更常使用每像素位数。颜色精度和色域通过颜色编码规范定义。
11. 什么是抗锯齿,为什么它很重要?
抗锯齿是计算机图形学中的一种技术,它可以去除锯齿效应,锯齿效应会导致光栅化图像出现锯齿状边缘。此问题源于欠采样,这是低频扫描转换引起的失真。
当使用像素光栅化平滑的连续曲线时,就会出现锯齿现象,抗锯齿的原因是欠采样。
应用抗锯齿后,图像变得平滑,产生更清晰的线条,使图像在实际操作中更有效。
12. 二维图形和三维图形有什么区别?
二维图形和三维图形在创建和结果上有所不同。二维图形由高度和宽度组成,而三维图形增加了深度以实现真实感。
二维图形通常用于动画和视频游戏中,提供屏幕上运动的平面视图。三维图形提供逼真的深度,允许观看者看到空间内部,观察光线和阴影的移动,并更全面地理解内容。它们与大脑探索和丰富我们对世界的理解的自然倾向相协调。
13. 什么是齐次坐标?
齐次坐标在计算机图形学中得到了相当广泛的应用。这是用于在二维图像平面上显示三维对象的几何学的基础。它们提供了一个执行欧几里德空间中点运算的标准,例如矩阵乘法。
这些坐标系统以两种方式使用:通过添加额外值,以及通过解决表示和实现几何对象变换的问题。大多数图形都由矩阵表示,这些矩阵应用于笛卡尔形式的向量。
14. 计算机图形学中的变换矩阵是什么?
变换矩阵是一个方阵,它表示向量空间中的线性变换。它通过保持空间的线性属性将坐标系从一个变换到另一个。
该矩阵携带系数,使计算和更改几何对象更容易。
$$\mathrm{\begin{bmatrix}a & b \\c & d \end{bmatrix} \: \begin{bmatrix} x \\ y \end{bmatrix} \: = \: \begin{bmatrix} x' \\ y' \end{bmatrix}}$$
例如,在具有坐标向量 i 和 j 的二维坐标系中,变换矩阵T可以将向量v = (x, y)变换为向量w = (x', y'),从而创建一个新的坐标系。矩阵的系数决定了变换的方向,并用于找到向量w。
15. 二维/三维变换中的平移、缩放和旋转是如何工作的?
平移、缩放和旋转是二维和三维变换中使用的关键技术,用于改变物体的位移、方向和大小。
我们可以创建一个矩阵,添加x、y和z参数来平移到另一个坐标。
缩放使用沿 X、Y 和 Z 方向的缩放因子在坐标中调整大小。因此,在这里使用缩放矩阵,我们为每个轴使用缩放因子。
对于旋转,我们使用带有正弦和余弦的三角函数。旋转改变物体围绕一个或多个轴的朝向,可以围绕网格中心或沿一条线旋转。
16. 图形渲染中的视图矩阵是什么?
视图矩阵是一个用于将顶点从世界空间转换为视图空间的矩阵,通常与物体的世界矩阵和投影矩阵连接在一起。这允许顶点在顶点程序中直接从物体空间变换到裁剪空间。
如果M代表物体的世界矩阵,V代表视图矩阵,P是投影矩阵,则连接的世界、视图和投影可以用MVP表示。
17. 什么是透视投影?它与正交投影有何不同?
正交投影是平行投影,可以用仿射变换表示。透视投影不是平行投影。它们由于艺术和技术原因而有用,例如验证平面图中的零件配合或以不同的基准表示问题以简化坐标。
在下面的示例中,我们可以看到对于透视投影,我们假设线条将在一点处相交;但对于正交投影,它将在无限远处相交。
正交投影通常用于 CAD 绘图和技术文档中,以确保尺寸易于测量,并以不同的基准表示问题,以便于理解。
18. 图形中的裁剪的概念是什么?
为了显示图片的大部分内容,需要缩放和平移,并识别可见部分。这个过程具有挑战性,因为有些部分部分在内部,并且部分可见的线条或元素被省略。
裁剪是一个用于确定每个元素的可见部分和不可见部分的过程,选择可见部分并丢弃不可见部分。有各种类型的裁剪,包括线裁剪和多边形裁剪。
19. 什么是向量,它们如何在计算机图形学中使用?
矢量图形是一种用途广泛且可缩放的计算机图形方法,它使用数学方程和几何形状而不是基于像素的栅格图形。它们没有分辨率限制,并且在任何尺寸下都能保持图像质量。
图形艺术家将其作品保存为矢量声明。最流行的矢量图形格式是 SVG,它们基于解析几何或坐标几何。
Ivan Sutherland 在 1963 年发明了矢量图形,并开发了第一个矢量图形编辑器 Sketchpad,它允许用户在计算机屏幕上创建和编辑矢量图形。
20. 什么是光线追踪,它与光栅化有何不同?
光线追踪是一种用于实时计算机图形的技术,用于在二维屏幕上显示三维物体。它涉及观察从你的眼睛到光线相互作用的物体的光束路径。
另一方面,光栅化是一种用于在二维屏幕上显示三维物体的技术。它从虚拟三角形的网格创建物体的 3D 模型,其中每个三角形的顶点与不同大小和形状的其他三角形相交。这些信息,包括位置、颜色、纹理和“法线”,决定了物体的表面方向。
21. 法线向量在光照计算中的作用是什么?
法线向量用于三维图形的光照计算。它们指示每个点的表面方向。这是光线反射和阴影所必需的。这些向量对于计算漫反射和镜面反射、创建逼真的高光以及实现凹凸贴图等技术至关重要。
在着色器程序中,法线向量是各种光照模型的关键输入。它们允许高效地创建复杂的光照效果,而无需过多的几何细节,这使得它们对于实时三维渲染和平滑的表面光照是必要的。
22. 深度缓冲区在三维渲染中的意义是什么?
深度缓冲区在三维渲染中对于确定物体和表面的可见性至关重要。如果没有它们,渲染顺序会导致面片的层叠不正确。
对于一个简单的立方体,如果系统不知道正确的顺序,它将显示每个面,但它们将以任何顺序显示,并且隐藏的面可能在前面可见。为了应用面剔除,它需要深度缓冲区。
23. 什么是 Bresenham 直线绘制算法?
Bresenham 直线算法是一种 n 维栅格绘制算法,它选择点来形成两点之间直线的近似值。它通常用于在位图图像中绘制直线图元,因为它使用廉价的操作,如整数加法、减法和位移。
作为增量误差算法,它是计算机图形学中最早的算法之一。该算法的扩展称为中点圆算法,可用于绘制圆。
24. 什么是扫描线算法,它如何在光栅图形中使用?
扫描线算法是三维图形中用于隐藏面消除的算法。该算法一次处理一行,而不是一次处理一个像素。
扫描线算法检查扫描线与多边形表面相交的点(从左到右),执行深度计算以识别隐藏区域。然后,如果相应表面的标志打开,它会更新刷新缓冲区中的颜色强度值。
25. 什么是中点圆算法?
中点圆算法是计算机图形学中用于高效绘制圆的方法。它是 Bresenham 直线绘制算法的扩展。它的工作原理是确定哪些像素应该着色以在数字屏幕上形成一个圆。
从一个点开始,算法沿着圆的圆周移动,决定是直线移动还是对角移动到下一个像素。它通过计算两个可能像素之间的中点来做出这些决定。这种方法避免了使用复杂的三角函数计算,使其更快、更容易实现。
26. 泛洪填充算法是如何工作的?
泛洪填充算法是一种用于填充区域中多个颜色边界的方法。它从区域内的种子点开始,使用四连通或八连通的方法用所需颜色填充它。
泛洪填充算法更适合于用一种颜色填充多个颜色边界和内部。填充算法从指定的内部点 (x, y) 开始,并将所有像素值重新赋值为所需颜色。然后它逐步遍历像素位置,直到所有内部点都被重新绘制。
27. 什么是纹理映射?
纹理贴图是应用于形状或多边形表面的图像,可以是位图或程序生成的。它们可以存储在图像文件格式中,由 3D 模型引用,或组装到资源包中。它们可以有一到三个维度,其中二维对于可见表面最常见。
现代硬件可以以改组或平铺的顺序存储纹理贴图数据,以提高缓存一致性。渲染 API 将纹理贴图资源管理为缓冲区或表面,允许“渲染到纹理”以获得额外的效果。
28. Z 缓冲区在三维渲染中的目的是什么?
Z 缓冲区只不过是一种深度缓冲区,它存储三维场景中不同物体的深度信息。
哪个物体在前面,哪个物体在后面,这些都是由 Z 缓冲区确定的。这对于以正确的方式表示三维物体至关重要。否则,一些没有放在后面的面会来到前面并生成无效的图像。
29. 什么是 Gouraud 着色,它与 Phong 着色有何不同?
Gouraud 着色计算顶点处的照明,并在多边形之间插值颜色。这种方法计算效率高,但会产生可见的伪影,尤其是在镜面高光的情况下,随着视角的变化,镜面高光可能会出现角度或在顶点之间跳跃。质量在很大程度上取决于模型的复杂性。
另一方面,Phong 着色在多边形之间插值照明参数,并计算每个片段的照明。这种方法产生更平滑、更逼真的结果,特别是对于镜面高光,镜面高光看起来圆润并在表面上流畅地移动。
30. 什么是环境光遮蔽,它如何在渲染中使用?
环境光遮蔽是一种用于三维图形的照明技术。这会添加细微的阴影,使场景看起来更逼真。
在下图中,这将更加清晰。它模拟了物体在现实世界中如何遮挡光线,使物体紧密相邻或位于角落的区域变暗。
此技术计算每个表面点可以“看到”多少环境光,从而在封闭空间中创建更柔和的阴影。这显着提高了三维渲染场景的整体视觉质量和真实感。
31. 着色器和纹理之间的主要区别是什么?
着色器和纹理是三维图形中两个重要的组成部分。它们用于不同的目的。着色器是 GPU 运行的程序,用于控制三维物体的渲染,影响照明、颜色和特殊效果。着色器可以创建复杂的可视效果,并且非常灵活,允许根据输入进行动态更改。
另一方面,纹理是应用于三维模型以添加细节和真实感的图像,提供诸如颜色图案、粗糙度或凹凸效果之类的表面信息。
32. 计算机图形学中动画的基本原理是什么?
计算机图形学中的动画只不过是一系列帧,其中每一帧都在场景中生成图形输出。通常,并非所有帧都是以类似的方式生成的。
插值的概念用于动画创建。这可以使用线性、二次或其他插值类型来完成。有几种类型的动画,包括关键帧动画、变形动画、补间动画等。
33. 计算机图形学中的插值是什么?
插值技术用于计算机图形学的动画创建。这些用于通过获取两帧并生成中间帧来实现平滑动画过渡。
有几种类型的插值,包括线性、二次等。这些可以用于移动旋转、缩放动画以及变形和其他一些技术,如角色动画(行走、跑步)等。
34. 什么是场景图?
在计算机图形学中,场景图是基于矢量的图形编辑应用程序和现代电脑游戏中使用的数据结构,用于排列图形场景的逻辑表示。它由树结构中的节点组成,父节点的效果应用于其所有子节点。
在许多程序中,几何变换矩阵用于有效地处理操作,例如将相关的形状和对象分组到可以作为单个对象操作的复合对象中。
35. 计算机图形学中的全局照明是什么?
全局照明 (GI) 是一组三维计算机图形算法,用于增强三维场景中的逼真照明。这些算法同时考虑直接光源和间接光源,包括反射、折射和阴影。它们模拟这些效果,影响其他物体的渲染。
然而,在实践中,只有漫反射或焦散被认为是全局光照,因为它们模拟了场景中来自同一光源的光线对其他表面的影响。
36. 分形与计算机图形学有什么关系?
分形是计算机使用迭代,基于单个公式创建的复杂图像。
几何分形是用自然界中存在的非整数形状生成的。这些是通过从初始形状开始,用生成器替换部分来创建的,从而产生确定性的、非随机的自相似分形。
37. 实时渲染和离线渲染的图形技术有何不同?
离线渲染是一种传统的方法,通过在显示最终结果之前计算场景中的每个像素来创建图像或动画。它使用强大的软件,如 Autodesk 3ds Max、V-Ray 或 Blender Cycles 等。
实时渲染是一种快速的方法,用于视频游戏和交互式应用程序,并且在建筑可视化中越来越受欢迎。
38. 什么是 GPU,它如何加速图形渲染?
GPU 是一种专门的电路,可以高效地处理和操作计算机图形和图像数据。这将计算密集型任务从 CPU 中卸载,使 CPU能够处理更多通用的计算工作负载。
GPU 用于游戏和 3D 图形渲染。它通过实时渲染复杂的场景和高分辨率纹理来帮助图形处理,处理变换、顶点生成、像素着色器、抗锯齿等。
39. 什么是 OpenGL,为什么它在图形开发中被广泛使用?
OpenGL 是一个与图形相关的 API,用于与图形硬件 (GPU) 通信。它提供应用程序的图形表示。
OpenGL 允许通过硬件加速渲染 2D 和 3D 矢量图形,使其广泛用于 VR、CAD 和游戏中。OpenGL 是跨平台和与语言无关的。
40. DirectX 与 OpenGL 相比如何?
OpenGL 和 DirectX 在功能方面并不相似。DirectX 是一套 API,包括 Direct3D 和 Direct2D,它们仅与 Microsoft 平台(如 Windows 和 Xbox)兼容。OpenGL 是跨平台的,与 Microsoft、Apple 和 Linux 系统兼容。
Apple 已弃用 OpenGL;但是,在 macOS 和 iOS 上,它仍然受支持。在游戏帧率和系统资源使用方面,OpenGL 和 DirectX 11 几乎不相上下,在大多数情况下几乎没有明显的区别。
41. 3D 渲染中 LOD(细节层次)的概念是什么?
计算机图形中的细节层次 (LOD) 指的是 3D 模型表示的复杂程度。当模型远离观看者移动时,或者基于对象重要性或视角相关的速度等指标,可以降低其复杂程度。
LOD 技术通过减少图形流水线阶段(通常是顶点变换)的工作负载来提高渲染效率。LOD 通常应用于几何细节,但可以推广到包括着色器管理和 mipmapping 以获得更高的渲染质量。
42. 什么是游戏引擎,它与计算机图形学有什么关系?
游戏引擎是一种帮助创建视频游戏的软件。它处理许多任务,例如渲染图形、处理物理、管理音频和处理用户输入。
在计算机图形学中,游戏引擎的图形引擎非常重要。它渲染 2D 和 3D 可视化效果,确保图像流畅逼真。这允许游戏开发者专注于游戏设计,而不是从头开始构建图形。
一些流行的游戏引擎包括Unity、虚幻引擎和Godot。
43. 实时图形中使用的一些常见优化技术是什么?
优化技术用于通过去除不必要的计算来提高不同应用程序的性能并使系统更快。有很多这样的优化技术,包括以下这些:
- 实例化 - 多次重复使用相同的对象,并进行不同的变换,从而减少绘制调用次数。
- 剔除 - 跳过对相机不可见的物体的渲染,节省处理能力。
- 细节层次 (LOD) 管理 - 对远处物体使用更简单的模型,以保持性能而不牺牲视觉质量。
44. VR 的图形技术与传统的 3D 图形有何不同?
VR 的技术是不同的。在 VR 中,我们使用立体图像,其中两张图像合并在一起以获得逼真的 3D 视图。另一方面,传统的 3D 图像是 2D 渲染,没有真正的 3D 感。
可以说,VR 图形在沉浸感、性能、视野和交互方面有所不同。VR 旨在提供完全沉浸式的体验。传统的 3D 图形侧重于视觉表示。高帧率和低延迟是流畅交互所必需的,而更宽的视野则模拟了人类的视觉。