什么是计算机图形学(CG)
1. CG
1.1 定义
ISO:研究通过计算机将数据转换为图形,并在专门显示设备上显示的原理、方法和技术的学科
IEEE:利用计算机产生图形图像的艺术或科学
国内:利用计算机研究图形的表示、生成、处理和显示的学科
汇总:研究通过计算机将场景对象转换为图形并进行显示为图像的一门学科
- 表示/建模:如何用图形方式表示真实或虚拟世界中的场景对象
- 显示/绘制:将数字几何模型转换为直观形象的图像形式
图形和图像的区别
图形学相关学科
1.2 目标
核心目标:创建有效的视觉交流,帮助人脑从图形图像的角度理解事物本质
视觉交流
- 观察->问题/信息:通过观察,明确问题或要传达的信息
- 问题/信息->几何:通过建模表达问题,使问题可以用几何模型抽象地表示
- 几何->图像:将问题或信息可视化
应用领域
- 计算机辅助设计与制造(CAD/CAM):工程和建筑设计,帮助创建精确的2D和3D模型
- 科学计算可视化(visualization):将复杂的数据和模型以可视化形式呈现,使科学研究和分析更加直观
- 虚拟现实(Virtual Reality):提供沉浸式体验,广泛应用于游戏、教育和模拟训练中
- 动画(Animation):创造动态视觉内容,涵盖电影、游戏和广告等多个领域
1.3 图形系统
图形系统组成及相互关系
图形软件和图形硬件
图形应用数据结构:
- 几何信息:形状、大小
- 拓扑信息:位置、布局
- 属性信息:颜色、亮度、纹理
- 非几何信息:标题、标记
2. 图形硬件
2.1 图形显示设备
2.1.1 阴极射线管(CRT)
工作原理:高速电子束由电子枪发出,经过聚焦系统、加速系统和磁偏转系统,到达荧光屏的特定位置,荧光物质的电子被轰击后从低能态高能态,但是高能态的电子十分不稳定,会重新跃迁回低能态,这期间会释放出能量,以光的形式表现出来
电子枪:发射电子,并控制其强度
- 加热器:升温使金属阴极上的电子摆脱能垒的束缚
- 金属阴极:通常由铯、锂或其他金属制成,特殊的金属存储大量电子
- 电平控制器:加上正电压,电子束大量通过,形成较亮的点;加上负电压,电子束被部分或全部阻截,形成较暗的点
聚焦系统:是一个电透镜,将分散的电子聚焦成细束
加速系统:通过施加高电压来增加电子的动能,使其携带足够多的能量来激发荧光物质
磁偏转系统:使用磁场控制电子束的路径,使其能够精确地定位到荧光屏的特定位置
如何保持荧光屏上有稳定图像?- 持续发射电子束来刷新屏幕:刷新一次指电子束从上到下将荧光屏扫描一次
- 足够快地发射电子束:大约每秒刷新60次即60帧,人眼才能感觉到屏幕不闪烁,一般65帧以上人眼才会感觉舒服
- 隔行扫描:如果无法保证扫描速度,则可以采取隔行扫描的技术,即每次交替扫描偶数/奇数行,这样能够近似扫描频率加倍的效果
- 荧光屏上涂有三种荧光物质,分别发送红绿蓝三原色的光
- 电子束发送三束电子来激发三种荧光物质,中间通过一个控制栅格来决定电子束的到达位置
- 电子枪有8位256级的强度控制,就可以利用三原色来构造各种各样的颜色
2.1.2 液晶显示器(LCD)
液晶特性:液晶受到电压影响时,物理性质会改变,此时通过它的光的折射角会发生变化,从而产生色彩
显示原理:光线首先通过一个垂直光偏振器,然后通过控制两片夹有液晶材料的平行玻璃板之间的电极,来改变交叉处液晶材料特性,进而改变光的偏振状态,电极排布成行和列,形成一个网格,每一个行列交叉处定义了一个像素,最后光线通过水平光偏振器
亮暗控制:通过精确控制每个像素的电压,液晶显示器能够控制光的亮度
成像原理是光的折射,因此在不同角度看液晶显示屏必然会有不同的效果,能看到清晰图像的最大角度被称为可视角度,工业上有相关标准来定义可视角度
2.2 图形显示方式
2.2.1 随机扫描显示
绘制原理:电子束可以在显示屏的任意方向上自由移动,按照命令用画线的方式绘出图形
刷新原理:图形的定义以矢量画线命令的形式存放在显示文件中,由显示处理器处理,更改显示文件以在下一次刷新时修改图形
性质
- 响应快速,适合实时图形和动画
- 适合显示矢量图形,如线条和轮廓
- 不能逼真地显示彩色图形
- 图形的显示质量和处理时长都与一帧的画线数量相关
2.2.2 光栅扫描显示
绘制原理:电子束按照固定的扫描顺序进行扫描,即先从荧光屏的左上角开始,向右扫描一条水平线,然后迅速回到最左边下一行的位置,继续扫描第二条水平线,以此类推直到最后一条水平线
刷新原理:光栅扫描显示设备是画点设备,可以看作成一个点阵,改变电子束的强度来控制每个像素点的亮度和颜色
性质
- 能够清晰显示复杂的位图图像,细节丰富
- 支持丰富的颜色深度和图形效果
- 占用内存较大
- 显示斜线时存在线条边缘的阶梯效应,即走样
2.2.3 光栅扫描显示系统
组成
- 显示器:由像素构成的光栅网格
- 视频控制器/显示控制器:进行光栅操作,如刷新、移动、裁剪、消影等
- 帧缓冲存储器/帧缓存/显存:存储像素的灰度、颜色等图像信息
性质
- 分辨率:行方向和列方向可寻址的地址数的乘积,表示显示器的清晰度
- 帧率/刷新率:每秒刷新的帧数,表示显示器的流畅度
分辨率m×n,颜色数K,和显存大小V满足:
2.3 显卡和GPU
显卡:全称显示接口卡,也叫显示适配器,是主机与显示器连接的桥梁,用于控制计算机的图形输出
- 图形处理器(GPU):处理需要显示的数据
- 显存(video memory):存储图像数据的高速内存
- 数模转换器(DAC):将数字信号转换为模拟信号,并传输给显示器
如果说CPU是主机的心脏,那么GPU就是显卡的心脏
GPU的最重要特性:高效执行大量并行计算
- 图形渲染:适合实时生成和渲染3D图像,常用于游戏和动画
- 并行计算:适合大规模计算任务,性能远超CPU,常用于深度学习和人工智能
目前显卡供应商主要有:英特尔(Intel)、超微半导体(AMD)和英伟达(Nvidia)
3. 图形软件
4. 图形流水线
4.1 三阶段
- 应用程序阶段:开发者将数据以图元的形式提供给图形硬件
- 几何处理阶段:负责处理多边形和顶点操作,如顶点变换、投影、裁剪、着色、光照计算等,以生成最终的几何图形
- 光栅阶段:屏幕对象被传到像素处理器进行光栅化,然后输出到显示器
4.2 处理单元
顶点(vertex):是构成3D模型的基本单元,每个顶点包含位置坐标向量(X、Y、Z)和其他属性信息
点云(Point Cloud):大量顶点组成的集合,用于表示3D空间中的物体或场景
图元(primitive):是图形渲染的基本构建块,通常指三角形、线段或点,用于描述物体的形状
片元(fragment):是光栅化的结果,包含颜色、深度、纹理等信息
像素(pixel):是图像的最小显示单元,表示屏幕上可见的单个点
片元包含了比像素更多的信息,单个像素是最终呈现在图像上的点,可能会从多个片元中挑选一个
4.3 处理操作
三角化(Triangulation):将复杂的多边形或曲面分解为三角形,这是因为三角形是最简单的图形单元,能够有效地表示各种形状,简化渲染计算
投影(Projection):将3D坐标转换为2D坐标的过程
裁剪(Clipping):裁剪是去除视野外的图形部分,以提高渲染效率
纹理映射(Texturing):将纹理应用于3D模型表面的过程,将图像细节与模型几何相结合,增强视觉效果
遮挡探测(Occlusion Detection):确定哪些对象被其他对象遮挡,以优化渲染顺序和效率
光栅化(Rasterization):将几何图形转换为片元的过程
4.4 OpenGL流水线
顶点着色器:负责对顶点进行坐标变换、投影变换等操作
光栅着色器器:将图元转换为片元
片元着色器:负责对片元进行颜色处理、纹理处理等操作
5. OpenGL
5.1 介绍
OpenGL(Open Graphics Library)被认为是一个应用程序编程接口(API),包含了一系列可以操纵图形和图像的函数,其严格规定了每个函数该如何执行,以及他们的输入输出值
实际上,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范,具体的实现是由驱动开发商针对特定显卡实现的
5.2 模式
立即渲染模式(Immediate mode):允许程序直接调用绘制命令,并立即渲染图形,这种方式易于使用,但效率较低,因为每个绘制调用都会与GPU通信
核心模式(Core-profile):推荐使用着色器和顶点缓冲对象来提高性能和灵活性,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程
5.3 状态机
状态机(State Machine):OpenGL依赖于一系列变量来指示运行
上下文(Context):包含OpenGL所有状态和资源的环境,每个上下文是独立的,通常在不同的窗口或线程中创建,并且使用当前的OpenGL上下文来渲染
OpenGL实现的本质- 设置选项:使用状态设置函数改变上下文指示绘图
- 操作缓冲:使用状态使用函数根据上下文执行操作
- 渲染图形:使用状态渲染函数根据上下文进行渲染
5.4 对象
OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库
OpenGL对象(object):是一些选项的集合,代表OpenGL状态的一个子集
1 | struct object_name { |
OpenGL结构体(struct):OpenGL上下文被当做一个大的结构体,通过库中的函数来设置结构体中的对象,从而改变OpenGL状态
1 | struct OpenGL_Context { |
5.5 GLAD和GLFW
GLAD:由于OpenGL的功能在不同平台和驱动中可能不同,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用,非常复杂且繁琐。而GLAD是一个OpenGL加载库,可以帮助开发者动态加载所需的OpenGL函数,且不必担心兼容性问题
GLFW:是一个跨平台的窗口管理库,提供了一些渲染物体所需的最低限度的接口,用于创建OpenGL上下文、定义窗口参数以及处理用户输入,使得开发者可以专注于图形渲染,而不用处理底层平台差异
配置参考
5.6 特点
- 应用广泛:无论是在PC机上,还是在工作站上,甚至在大型机和超级计算机上都能表现出它的高性能和强大威力
- 跨平台性:OpenGL能够在几乎所有的主流操作系统上运行
- 可扩展性:可以利用API进行功能扩充
- 绘制专一性:OpenGL只提供绘制操作访问,而没有提供建立窗口、接受用户输入等机制,它要求所运行环境中的窗口系统提供这些机制、
- 网络透明性:OpenGL允许一个运行在工作站上的进程在本机或通过网络在远程工作站上显示图形

















