第一章 计算机图形学与图形流水线
1.1 计算机图形学的概念及主要研究内容
计算机图形学(Computer Graphics,简称CG)
- 计算机图形学是一门研究如何利用计算机进行图形的计算、处理和显示的学科。
- 简单地说:是一种使用数学算法将二维或三维图形转化为计算机显示器所能显示的二维栅格形式的科学。
计算机图形学的三大研究内容
- 建模(Modeling):构造场景的三维模型
- 绘制/渲染(Rendering):将三维场景画在屏幕上
- 动画(Animation):采用连续播放静止图像的方法产生物体运动的效果
- 拓展:什么是计算机图形学
1.1.1 Modeling
要在计算机中表示一个三维物体,首先要有它的几何模型表达。因此,三维模型的建模是计算机图形学的基础,是其他内容的前提。表达一个几何物体可以是用数学上的样条函数或隐式函数来表达;也可以是用光滑曲面上的采样点及其连接关系所表达的三角网格/三角面片来表达(即连续曲面的分片线性逼近),如下图所示:
1.1.2 Rendering(绘制/渲染)
有了三维模型或场景,怎么把这些三维几何模型画出来,产生令人赏心悦目的真实感图像?这就是传统的计算机图形学的核心任务-----渲染。其本质就是根据三维模型,计算屏幕窗口中每个像素点的颜色。而像素点颜色又与光照、环境以及物体材质等因素有关。
-
常见的绘制/渲染方式
-
- 逐像素绘制
- 从视点出发,连接像素,引出一条射线,射入场景之中,与场景中物体相交,引出一个交点,然后计算交点的颜色,把颜色填到像素。
- 逐像素绘制
-
- 逐面片绘制(更常见)
-
它以物体的面片为处理对象,所有物体都以多边形面片组成,一个面片一个面片的处理,把面片投影到二维平面上,然后对二维的三角形执行一个光栅化的操作,求出二维三角形所覆盖的所有像素,然后计算每一个像素的颜色。
-
模型由许多面片(polygon)组成
-
逐面片地进行投影、光栅化(Rasterization)
-
- 逐面片绘制(更常见)
-
1.1.3 Animation
动画是采用连续播放静止图像的方法产生物体运动的效果。计算机动画借助于编程或动画制作软件生成一系列的景物画面,是计算机图形学的研究热点之一。
计算机动画的应用领域广泛,比如动画片制作,广告、 电影特技,训练模拟,游戏等。
- 拓展:网上的一些3D动画的视频
- The Killer Bean: http://v.youku.com/v_show/id_XMjI5ODE2MTEy.html
- 爱与孝: http://v.youku.com/v_show/id_XNTU0OTUxNjUy.html
- 房地产动画广告宣传片: http://v.youku.com/v_show/id_XNTc1OTE4MDMy.html
1.2 图形与图像的差别
1.2.1 图形(Graph) 与 图像(Image)
图形(Graph)和图像(Image)都是多媒体系统中的可视元素,虽然它们很难区分,但确实不是一回事。
图形是矢量图(Vector Drawn),它是根据几何特性来绘制的。图形的元素是一些点、直线、弧线等。矢量图常用于框架结构的图形处理,应用非常广泛,如计算机辅助设计(CAD)系统中常用矢量图来描述十分复杂的几何图形,适用于直线以及其它可以用角度、坐标和距离来表示的图。图形任意放大或者缩小后,清晰依旧。
图像是位图(Bitmap),它所包含的信息是用像素来度量的。就像细胞是组成人体的最小单元一样,像素是组成一幅图像的最小单元。对图像的描述与分辨率和色彩的颜色种数有关,分辨率与色彩位数越高,占用存储空间就越大,图像越清晰。
图形是人们根据客观事物制作生成的,它不是客观存在的;图像是可以直接通过照相、扫描、摄像得到,也可以通过绘制得到。
【总结而言】
- 图像:一堆像素组成的二维栅格
- 图形:含有表示“形”的几何信息
- 图形之中也会有图像的成分
- 图形的显示最终要转化为图像
- 图形中的纹理就是图像
1.2.2 几个学科的区别
- 计算机图形学(Computer Graphics)
- 数字图像处理(Digital Image Processing)
- 计算机视觉(Computer Vision)
CG: 三维模型 → 绘制 → 二维图像
IP: 二维图像 → 分析处理 → 得到其他信息或生成某种特效...
CV: 二维图像 → 分析处理 → 三维信息
1.3 图形流水线总览
本质就是逐面片绘制的一个固定步骤而已
1.3.1 Graphics Pipeline 引出
- 简单理解:在计算机中将3D模型转化为屏幕上的图像需要经过一系列的处理步骤,这个处理步骤就是图形流水线,也被称作渲染管线。
- 1992年,SGI 发布OpenGL1.0,图形流水线逐渐形成业界标准。
- 1994年出现PC显卡,1999年出现GPU,图形流水线逐渐硬化到了PC机专用的图形硬件上来实现。
【拓展:SGL 与 OpenGL】
在上世纪80年代早期,Silicon Graphics(SGI)为了在自己的工作站上进行2D和3D图形处理而引入了一种专有API, 命名为 IRIS GL(综合光栅成像系统图形语言)。1922年,SGI 对这个实现进行了修订,并将它作为一种开放的行业标准发布,这就是OpenGL。1993年,Brian Paul 开始进行一项工程,创建一个纯软件的 OpenGL 实现,名为 Mesa3D, 由此开启了不受特定硬件供应商约束而广泛支持3D渲染的大门。
1.3.2 图形流水线
OpenGL和Direct3D都定义了图形流水线(graphics pipeline)概念,包括一系列计算机图形显示过程中必须执行或可选的图形操作。目前,所有GPU的操作都是围绕图形流水线设计的。**因此,学习OpenGL绝不能只是学习一堆离散的函数,而必须很好地理解图形流水线的整体流程及各个环节,否则学习OpenGL函数如同盲人摸象。**下图1中是OpenGL蓝宝书中的图形流水线(基于OpenGL1.0)。但当前的图形流水线已非常复杂,因此单独给出下图2(只包含基本操作的简化图形流水线)来说明。
- 主要阶段如下:
- 模型由面片组成,面片又由顶点组成。
CPU
负责组织顶点数据,数据处理完成之后,就交给GPU
去处理后面的任务。 Vertex operations
: 顶点处理阶段,会对顶点数据进行一些列的变换,是由三维模型到二维图形的转换- 几何变换
- 投影 (3D->2D)
- 裁剪
- 视口变换
Rasterization
:光栅化,此过程大概就是计算二维图形所覆盖的所有片元(fragment)。Fragment operation
:此阶段是对光栅化后的片元进行处理的阶段,进行颜色的很多处理,然后把片元的颜色填入帧缓冲区中,随后就显示到了屏幕之上。
- 模型由面片组成,面片又由顶点组成。
- 相关拓展:
1.4 图形开发库
在进行三维图形开发过程中,有很多现成的开发库,总结如下:
实际开发中,一般会使用OpenGL作为基础图形库,然后用freeglut作为它的辅助的工具库,再用glew来调用它的扩展功能。
1.4.1 OpenGL
OpenGL(Open Graphics Library)是一种应用程序编程接口,是图形编程的业界标准之一(除了OpenGL, 还有Direct3D),它是一种可以对图形硬件设备特性进行访问的软件库。OpenGL库的4.5版本包含了超过500个不同的命令(函数),用户可以调用来完成各种绘图任务。
需要说明的是,不要仅仅把OpenGL当做是一堆函数的松散集合,其实在OpenGL里面它要严密的围绕图形流水线来组织(早在OpenGL 1.0发布时就已确定了当今图形流水线的雏形)。因此学习OpenGL绝不能只是学习一堆离散的函数,而必须很好地理解图形流水线的整体流程及各个环节,否则学习OpenGL函数如同盲人摸象。
1.4.2 辅助OpenGL开发的工具库
- aux, glut, freeglut, glfw
- 提供了管理窗口的功能
- 加入了键盘、鼠标等的交互接口
- 可能还提供了右键菜单等交互功能
- 提供了一些“高级”建模函数(如
glutSolidTeapot()
) - Aux,微软从大约2007年开始已不更新
- glut →freeglut
- glfw
- 拓展:《OpenGL 下面的 glut、freeglut、glfw 都是个啥》
1.4.3 OpenGL 与 Direct3D
- Direct3D在游戏界占优
- OpenGL跨平台!!!
- 两者背后是同样的图形流水线
- 其他的三维图形库都构建在OpenGL或Direc3D基础之上:OSG, OGRE, Unity3D…
1.5 何为GPU
- GPU😗* Graphics Processing Unit
- CPU😗* Central Processing Unit
- GPU是显卡中的核心芯片**
- GPU用来处理屏幕显示相关的计算;并实现图形流水线**
- 现在,GPU已成为计算机中发展最快的硬件
1.5.1 GPU与CPU的发展曲线对比**
1.5.2 GPU的计算能力
- GPU 比 CPU 快!?
- 原因:GPU是并行的
- 例如:Geforce 7800有24条像素渲染管线;
Geforce 8800有128条流计算单元
- CPU是为了通用计算,而GPU 则只需执行相对固定的任务
- 因此,GPU更快,但不如CPU灵活、通用。
但是,现代GPU正变得越来越灵活,因其具有了可编程功能和统一渲染框架
1.6 GPU中图形流水线的发展及Shader编程
1.6.1 固定图形流水线
最早的图形流水线称之为固定管线,上面的每一个步骤(比如光照、贴图等)里面都会有一些参数(比如光照模式,纹理模式等等),整个渲染的过程就好像是在流水线上的每一道工序上面都有几个可选的开关,然后你要想实现不同的渲染效果,那就去花式扳开关就好了。
1.6.2 可编程流水线
但是大家的欲望是无限的,这么有限的扳开关的模式,渲染的效果实在是不理想,后来大家就把模式换成了流水线上坐着几个工人(Shader),然后给工人下命令(可编程)的方式了,这样的话只要工人忙得过来,那我就可以自己定义各种光照模型,贴图方式了,程序员的可发挥空间就大得多了。
1.6.2.1 Vertex && Fragment Operations
2002年开始,GPU在Vertex Operations和Fragment Operations这两个模块中具有了可编程功能。
- Vertex Shader of GPU
-
可直接在Vertex Shader中编程控制顶点的各种属性
-
- Fragment Shader of GPU
- 可直接在Fragment shader中编程控制片元、像素的各种属性
1.6.2.2 Geometry Shader
2006年,GPU流水线中增加了一个新的模块:Geometry Shader
- Geometry Shader of GPU
历代显卡精彩演示DEMO赏析点评之NV篇
- http://www.pcpop.com/doc/0/128/128790_all.shtml
历代显卡精彩演示DEMO赏析点评 ATI篇
- http://www.pcpop.com/doc/0/125/125661.shtml
Nvidia官网
- https://www.nvidia.cn/coolstuff/demos
热心网友
- https://space.bilibili.com/6681109?spm_id_from=333.788.b_765f7570696e666f.2
1.6.3 统一渲染构架
2006年,微软的DirectX 10提出了GPU的统一渲染构架
1.6.4 DirectX 11 Pipeline
2009.10 DirectX 11对图形流水线的进一步升级
1.6.5 GPU中进行全局光照(Global Illumination, GI)
2015年GTX 970/980发布时的Demo: 阿波罗11号
1.6.6 GPU编程
- Assembly
// 早期采用汇编代码编程很痛苦
…
FRC R2.y, C11.w;
ADD R3.x, C11.w, -R2.y;
MOV H4.y, R2.y;
ADD H4.x, -H4.y, C4.w;
MUL R3.xy, R3.xyww, C11.xyww;
ADD R3.xy, R3.xyww, C11.z;
TEX H5, R3, TEX2, 2D;
ADD R3.x, R3.x, C11.x;
TEX H6, R3, TEX2, 2D;
…
- Cg: (C for Graphics)
// 易读易写易改
// 跨平台
…
L2weight = timeval – floor(timeval);
L1weight = 1.0 – L2weight;
ocoord1 = floor(timeval)/64.0 + 1.0/128.0;
ocoord2 = ocoord1 + 1.0/64.0;
L1offset = f2tex2D(tex2, float2(ocoord1, 1.0/128.0));
L2offset = f2tex2D(tex2, float2(ocoord2, 1.0/128.0));
…
- Cg --- C for Graphics
- HLSL --- High Level Shading Language, for D3D
- GLSL --- GL Shading Language, for OpenGL
- 这就是所谓的shader编程
1.7 GPU的应用及未来
**GPU因其强大的计算能力,被用在各个领域 **
- 高性能计算领域**
- 各领域中的大计算量任务
- 医学、化学、生物、金融、科学计算、图像处理
- 人工智能
- 区块链
1.7.1 流体模拟
1.7.2 通用并行计算平台
- 2007,Nvidia公司发布了CUDA (Compute Unified Device Architecture) ---- 一个执行 GPGPU的计算平台
- 2008,Khronos Group提出了OpenCL (Open Computing Language) 1.0规范
- CUDA和OpenCL的出现,使得不具备计算机图形基础的人也可以利用GPU进行通用计算**
1.7.3 GPGPU
General-Purpose GPU——用GPU来完成通用计算!
- GPU已成为最重要的加速手段之一
- CPU与GPU的结合成为未来趋势
- 美国著名计算机科学家Jack Dongarra:“将来的计算架构会是CPU和GPU的结合”。
1.7.4 GPU在智能时代的机遇**
- 大数据、云计算、人工智能对计算提出了巨大的要求
- 深度学习与GPU一拍即合**
- Nvidia显卡的三个系列:
- Geforce是家用,娱乐用的
- Quadra是专业级显卡**
- Tesla是专用于计算的显卡**
- NVIDIA公司推出的基于“CPU+GPU”混合架构的Tesla高性能计算系统(2015)