计算机视觉导论:图像合成

Introduction to Image Synthesis

Posted by R1NG on February 11, 2022 Viewed Times

计算机图形学: 导论

本课程分为两个部分: 交互式计算机图形技术 (Interactive Computer Graphics, 图像合成) 与 图形处理技术 (Image Processing, 图像分析).

我们将在下面的章节中介绍图像合成的基本原理, 描述渲染管线和图形处理的基本原理, 并讨论如何使用 Open GL 的可编程管线设计图像合成系统, 以及实现一些基础的图像处理算法.

Open GL 简介

我们首先从介绍 OpenGL 开始. OpenGL 全称 Open Graphics Libaray, 和微软的 DirectX 类似, 是一个独立于硬件平台或程序设计语言之上的图形库标准. 其意义在于它封装了硬件层面对用户输入和显示输出的处理逻辑, 将其抽象为不同的 API, 从而抹平了不同硬件平台和程序设计语言带来的差异, 具备高度的通用性.

20220310101044

由于 OpenGL 的实质是 一套关于计算机图形指令 API 的规范, 因此它需要被特定的程序设计语言实现为 OpenGL 才能供程序设计者调用.

20220310101239

图形系统的基本架构如下图所示: 运行在处理器上的程序提供待渲染的 模型, 模型通过运行在图像处理器上的图形软件接收并转译 程序传来的 API 指令, 将其解译为基本的图形处理指令供图形处理器执行. 经过指令执行, 模型被拆解栅格化为像素, 随后传入帧缓冲内存 (Framebuffer Memory) 中, 经过数模转换器被转换为显示信号, 输出到显示器端.

20220310103112

图像管线

下面详细讨论 图像管线 (Graphics Pipeline) 的基本结构.

20220518092847

固化图像管线 Fixed Graphics Pipeline

图像管线一系列固定的 图形处理算法应用顺序. 以渲染三维模型为例, 上图所示的图形管线接受通过某种方式表示的三位边, 并经过一系列 顺序固定的操作 (基于视角变动的模型变换, 使用不同算法叠加光照效果, 对图形进行拆分, 栅格化, 以及执行诸如渲染, 隐藏面移除等更高级的操作).

在这一过程中, API 只能通过向图像管线 (不同步骤) 里使用的算法传入不同的参数 来实现对图像管线行为的控制.

可编程图像管线 Programmable Graphics Pipeline

可编程图像管线 具有更高的自由度, 允许程序员 自行实现 顶点着色器 (Vertex Shader)片段着色器 (Fragment Shader).

20220518093523

其中, 顶点着色器和片段着色器分别负责控制 几何图形顶点和边的渲染. 除了手动实现它们, 我们还可以声明直接在管线中调用图形库中已经实现的特定着色器, 如下图所示的 GLSL 顶点着色器:

20220518093755

以及下图所示的 GLSL 片段着色器:

20220518093847

最后给出固化图像管线与可编程图像管线的对比总结:

20220518093925

OpenGL 功能和应用

用户交互

如上文所述, OpenGL 只是图形库, 其主要功能是生成渲染图形, 不负责直接处理用户交互. 要实现所渲染出的 3D 图形和用户输入之间的交互, 需要使用外部库 GLUT:

20220518094254

图形功能

OpenGL 作为图形库, 支持多种复杂的图形渲染, 变换和优化技术:

20220518094350

如绘制 , 线, 多边形, 执行 转换 (如缩放, 平移, 转动等), 执行 不同光照条件下的渲染 (Lighting), 渲染 阴影 (Shading), 渲染 三维模型 并渲染纹理贴图 (Shading Textures)等.

封装库

OpenGL 贴近底层, 具备强大的功能和复杂实现. 而一些 OpenGL 封装库 的意义则为将 OpenGL 的常用功能 封装, 进一步使调用 OpenGL 更为便捷. 常见的 OpenGL 封装库有 封装了 OpenGL 图形渲染机能的 GLU:

20220518094737

以及提供了基础内建 3D 模型 (如茶壶, 球体, 立方体, 锥体等) 并且支持 用户交互GLUT:

20220518094932