OpenGL - 图形流水线简介
1.1 计算机图形学的概念
计算机图形学(Computer Graphics )简称CG,是一门研究如何利用计算机进行图形计算、处理和显示的学科,简单的说图形学是一种使用数学算法将二维或者三维图形转化为计算机显示器所能显示的二维栅格形式的科学,就是从
3D
到2D
的转换。
-
Modeling
:构造场景的三维模型 – 建模 -
Rendering
:将三维模型画在屏幕上–渲染 -
Animation
:让图像动起来–动画
渲染的意思:根据三维模型,计算屏幕窗口中每个像素点的颜色,像素点的颜色与光照、环境以及物体材质等因素有关,本质就是计算像素点的颜色
经典示例: http://physbam.stanford.edu/~fedkiw/
1.2 图形与图像的区别
日常生活角度来讲图形与图像并没有任何差别,图形英文是Graph
图像英文是Image
1. 图像
- 图像:一堆像素组成的二维栅格
2. 图形
- 图形:含有表示
形
的几何信息
- 图像会记录 整幅图整个区域中每一个像素的颜色,然后存在一个数组里,形成一个二维栅格
- 图形会记录顶点信息以及其他的信息
但是两者之间并不是完全分开,图形之中也会有图像的成分,因为图形的显示最终要转化为图像,图形中的纹理就是图像
3. 学科区别
1. 计算机图形学
简称CG
,主要是从三维模型到二维图像转换的一个过程
输入
三维模型 > 绘制 >输出
二维图像
2. 数字图像处理
简称IP
,主要是对图像的处理
输入
二维图像 > 分析处理 > 得到其他信息或者生成某种特效
3. 计算机视觉
简称CV
,同样也是对二维图像的处理
输入
二维图像 > 分析处理 > 三维信息
1.3 图形流水线
Graphics Pipeline
概念
简单的理解:在计算机中将3D
模型转化为屏幕上的图像需要经过一系列的处理步骤,这个处理步骤就是图形流水线。
图形流水线已经硬化到了显卡GPU
中,显卡就是专门用于画图的处理器。
1. 图形流水线总览
CPU
负责组织数据,数据处理完成之后,就交给GPU
去处理后面的任务
阶段如下
-
Vertex operation
:顶点处理阶段,会对顶点数据进行一些列的变换,是由三维模型到二维图形的转换- 几何变换
- 投影
- 裁剪
- 视口变换
-
Rasterization
:光栅化,此过程大概就是计算二维图形锁覆盖的所有像素 -
Fragment operation
:此阶段是对光栅化后的像素进行处理的阶段,进行颜色的很多处理,然后把片元填入帧缓冲区中
1.4 图形开发库
-
基础图图形库
OpenGL
,Direct3D
-
辅助
OpenGL
开发的工具库aux
,glut
,freeglut
,glfw
-
辅助调用
openGL
扩展功能的库glew
(shader开发),glad
-
基于OpenGL进行轻量级开发的库
bgfx
:可以进行多语言开发OpenGL
,不仅仅是使用C/C++
,还可以使用C#
,Python
… -
三维图形引擎
OSG
,OGRE
,对OpenGL
进行了封装,类似于three
对WebGL
的封装
1. 简单介绍
- OpenGL:(Open Graphics Library)开发的图形编程库
- 调用图形硬件的程序接口
- 大约由150个函数组成,用户可以调用来完成各种绘图任务
所谓调用图形硬件的程序接口,就是通过OpenGL去调用图形显卡驱动程序来进行绘图,而不是应用程序直接去调用显卡驱动,因为直接的调用显卡驱动是很难绘图的,所以通过OpenGL作为中间的媒介,来更好的进行绘制。
Direct3D在游戏界占据优势,是微软公司开发的图形库,OpenGL的优势是跨平台,可以在任何平台上使用,但是两者的背后都是同样的图形流水线
1.5 GPU简单介绍
GPU:Graphics Processing unit,图形处理单元
CPU:Central processing Unit,中央处理单元
- GPU是显卡中的核心芯片
- 用来处理屏幕显示相关的计算,并实现图形流水线
GPU比CPU快吗?
GPU是并行的,例如Geforce 7800 有24条像素渲染管线,可以做到24路并行,但是CPU是为了通用计算,而GPU之需要执行相对固定的任务,因此GPU更快,但是不如CPU灵活,通用,现代的CPU正变得越来越灵活,并且具有了可编程功能和统一渲染框架
1.6 GPU图形流水线发展
1. GPU和CPU对比
图形流水线式固定的,任何情况都按照一种模式进行,只能通过往函数中传递一些参数来影响它,因此固定图形流水线不够灵活
后来在2002年开始,GPU在Vertex Operation
和Fragment Operation
这两个模块中具有了可编程功能,可以通过代码来直接改变固定流水线的流程,当数据走到上面两个模块中时,可以通过程序来控制流水线
举例:比如模拟布料的效果,在以前是在CPU中把每一帧的顶点变化都计算出来,然后再传递给流水线去执行,但是有了Vertex Shader 之后就不再需要通过CPU去计算顶点发生的变化了,CPU只需要把顶点数据准备好,计算交给Vertex Shader就可以了,可以直接在Vertex shader 中编程控制顶点的各种属性
优点:
- 节省了数据传输消耗的时间,之前是通过CPU计算顶点数据,计算一帧之后都需要传给GPU,这样是很消耗时间的,而此时只需要传一次
- GPU是并行计算,如果物理模拟计算处理的比较好,那么在GPU中计算比CPU快的多
2. GPU的进化
在之前没有这个Geometry Shader
之前,有多少顶点就只能处理多少顶点,不能出现新的顶点,有了Geometry Shader
之后,就可以生成新的顶点和面片,可以在GPU中细化模型
例如一开始是一个粗糙的面片,然后通过Geometry Shader
可以不断的把这个粗糙的面片不断的进行细化,编程更细腻的模型
3. GPU编程
一开始编程的时候需要使用汇编语言,来进行GPU编程,然后可以通过Cg
来编程,今天可以使用的语言
-
Cg
—C for Graphics
-
HLSL
—High Level Shading Language ,for D3D
-
GLSL
—GL Shading Language ,for OpenGL
上面就是所谓的shader
编程,在了解了图形流水线的基础之上然后再学习shader
编程
1.7 GPU的应用及未来
GPU 因为其强大的计算能力,不仅仅用于画图,被用在各个领域
-
高性能计算领域
-
各个领域中的大计算任务
医学、化学、生物、金融、科学计算、图像处理
-
人工智能
-
区块链
通用并行计算平台
- Navidia — CUDA(Compute unified Device Architecture) 一个执行GPGPU的计算平台
- khronos Group — OpenCL(Open Computing language)
CUDA和OpenCL的出现,使得不具备计算机图形学基础的人也可以利用GPU进行通用并行计算
智能时代的机遇
- 大数据、云计算、人工智能对计算提出了巨大的要求
- 深度学习与GPU一拍即合
- Nvidia显卡的三个系列
- Geforee 是家用,娱乐用的
- Quadra 是专业级显卡
- Tesla 是专用于计算的显卡
- Navidia 公司推出机遇
GPU + CPU
混合架构的Tesla高性能计算系统(2015)