计算机图形学: 导论
本课程分为两个部分: 交互式计算机图形技术 (Interactive Computer Graphics
, 图像合成) 与 图形处理技术 (Image Processing
, 图像分析).
我们将在下面的章节中介绍图像合成的基本原理, 描述渲染管线和图形处理的基本原理, 并讨论如何使用 Open GL
的可编程管线设计图像合成系统, 以及实现一些基础的图像处理算法.
Open GL
简介
我们首先从介绍 OpenGL
开始. OpenGL
全称 Open Graphics Libaray
, 和微软的 DirectX
类似, 是一个独立于硬件平台或程序设计语言之上的图形库标准. 其意义在于它封装了硬件层面对用户输入和显示输出的处理逻辑, 将其抽象为不同的 API
, 从而抹平了不同硬件平台和程序设计语言带来的差异, 具备高度的通用性.
由于 OpenGL
的实质是 一套关于计算机图形指令 API
的规范, 因此它需要被特定的程序设计语言实现为 OpenGL
库 才能供程序设计者调用.
图形系统的基本架构如下图所示: 运行在处理器上的程序提供待渲染的 模型, 模型通过运行在图像处理器上的图形软件接收并转译 程序传来的 API
指令, 将其解译为基本的图形处理指令供图形处理器执行. 经过指令执行, 模型被拆解栅格化为像素, 随后传入帧缓冲内存 (Framebuffer Memory
) 中, 经过数模转换器被转换为显示信号, 输出到显示器端.
图像管线
下面详细讨论 图像管线 (Graphics Pipeline
) 的基本结构.
固化图像管线 Fixed Graphics Pipeline
图像管线 是 一系列固定的 图形处理算法应用顺序. 以渲染三维模型为例, 上图所示的图形管线接受通过某种方式表示的三位边, 并经过一系列 顺序固定的操作 (基于视角变动的模型变换, 使用不同算法叠加光照效果, 对图形进行拆分, 栅格化, 以及执行诸如渲染, 隐藏面移除等更高级的操作).
在这一过程中, API
只能通过向图像管线 (不同步骤) 里使用的算法传入不同的参数 来实现对图像管线行为的控制.
可编程图像管线 Programmable Graphics Pipeline
而 可编程图像管线 具有更高的自由度, 允许程序员 自行实现 顶点着色器 (Vertex Shader
) 和 片段着色器 (Fragment Shader
).
其中, 顶点着色器和片段着色器分别负责控制 几何图形顶点和边的渲染. 除了手动实现它们, 我们还可以声明直接在管线中调用图形库中已经实现的特定着色器, 如下图所示的 GLSL
顶点着色器:
以及下图所示的 GLSL
片段着色器:
最后给出固化图像管线与可编程图像管线的对比总结:
OpenGL
功能和应用
用户交互
如上文所述, OpenGL
只是图形库, 其主要功能是生成渲染图形, 不负责直接处理用户交互. 要实现所渲染出的 3D
图形和用户输入之间的交互, 需要使用外部库 GLUT
:
图形功能
OpenGL
作为图形库, 支持多种复杂的图形渲染, 变换和优化技术:
如绘制 点, 线, 多边形, 执行 转换 (如缩放, 平移, 转动等), 执行 不同光照条件下的渲染 (Lighting
), 渲染 阴影 (Shading
), 渲染 三维模型 并渲染纹理贴图 (Shading Textures
)等.
封装库
OpenGL
贴近底层, 具备强大的功能和复杂实现. 而一些 OpenGL
封装库 的意义则为将 OpenGL
的常用功能 封装, 进一步使调用 OpenGL
更为便捷. 常见的 OpenGL
封装库有 封装了 OpenGL
图形渲染机能的 GLU
:
以及提供了基础内建 3D
模型 (如茶壶, 球体, 立方体, 锥体等) 并且支持 用户交互 的 GLUT
: