快速理解OpenGL专业名词
OpenGL是做什么的
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
其他图形库:
- OpenGL ES (OpenGL for Embedded Systems):对OpenGL进行修改,为嵌入式设备而设计的另一套库
- DirectX:属于Windows系统的一套多媒体处理库,包含四大部分:显示部分、声⾳音部分、输⼊部分和网络部分
- Metal: Apple为游戏开发者推出了了新的平台技术Metal,该技术能够为3D 图像提⾼高10 倍的渲染性能.Metal 是Apple为了了解决3D渲染⽽而推出的框架
什么是GPU 图形渲染流水线(Pipeline)
程序按照固定的顺序执行,且不能更改顺序,称为管线,这个翻译非常不友好,不好理解,容易有歧义,叫流程、流水线更好。
GPU 图形渲染流水线的具体实现可分为六个阶段,如下图所示。
- 顶点着色器(Vertex Shader)
- 形状装配(Shape Assembly),又称 图元装配
- 几何着色器(Geometry Shader)
- 光栅化(Rasterization)
- 片段着色器(Fragment Shader),又称 片元着色器
- 测试与混合(Tests and Blending)
- 帧缓冲区(Framebuffer)
第一阶段:顶点着色器。该阶段的输入是 顶点数据(Vertex Data) 数据,比如以数组的形式传递 3 个 3D 坐标用来表示一个三角形。顶点数据是一系列顶点的集合。
第二阶段:图元生成。该阶段将顶点着色器输出的所有顶点作为输入,并将所有的点装配成指定图元的形状。图中则是一个三角形。图元(Primitive) 用于表示如何渲染顶点数据,如:点、线、三角形。
第三阶段:几何着色器。该 新顶点构造出新的(或是其它的)图元来生成其他形状。例子中,它生成了另一个三角形。
第四阶段:光栅化。该阶段会把图元映射为最终屏幕上相应的像素,生成片段。片段(Fragment) 是渲染一个像素所需要的所有数据。
第五阶段:片段着色器。该阶段首先会对输入的片段进行 裁切(Clipping)。裁切会丢弃超出视图以外的所有像素,用来提升执行效率。
第六阶段:测试与混合。该阶段会检测片段的对应的深度值(z 坐标),判断这个像素位于其它物体的前面还是后面,决定是否应该丢弃。此外,该阶段还会检查 alpha 值( alpha 值定义了一个物体的透明度),从而对物体进行混合。因此,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。
最后阶段,帧缓冲区(未在图中标明)。是由像素组成的二维数组,每一个存储单元对应屏幕上的一个像素,整个帧缓冲对应一帧图像即当前屏幕画面。帧缓冲通常包括:颜色缓冲,深度缓冲,模板缓冲和累积缓冲。这些缓冲区可能是在一块内存区域,也可能单独分开。
什么是着色器(Shader)
想象一下给方块上色,画阴影,画线条。上色、画图的这个工具叫着色器。在OpenGL中的着色器可以着很多东西,比如这三个
-
二维着色器
二维着色器处理的是数字图像,也叫纹理,着色器可以修改它们的像素。 -
像素着色器
像素着色器(英语:pixel shader)也叫片段着色器(英语:fragment shader),用于计算“片段”的颜色和其它属性,此处的“片段”通常是指单独的像素。最简单的像素着色器只有输出颜色值;复杂的像素着色器可以有多个输入输出。像素着色器既可以永远输出同一个颜色,也可以考虑光照、做凹凸贴图、生成阴影和高光,还可以实现半透明等效果。像素着色器还可以修改片段的深度,也可以为多个渲染目标输出多个颜色。
像素着色器还可以处理管线中间过程中的任何二维图像,包括精灵和纹理。因此,如果需要在栅格化后进行后期处理,像素着色器是唯一选择。 -
三维着色器
三维着色器处理的是三维模型或者其它几何体,可以访问用来绘制模型的颜色和纹理。下面几种都属于三维着色器
顶点着色器
顶点着色器是最早的三维着色器,顶点着色器处理每一个顶点,将顶点坐标投影在屏幕上,即计算顶点的二维坐标,同时还可以计算深度坐标。
几何着色器
几何着色器可以在着色器中生成新的顶点;
细分曲面着色器
细分曲面着色器(英语:tessellation shader)则可以向一组顶点中添加细节。这些着色器都会被安排在流水线(管线)中的。
什么是光栅化
光栅化就是根据所有顶点的位置,计算和确定需要多少个像素才能构成这个图形,这个图非常贴切。顶点下方的方块即是计算出来的像素点。
什么是纹理
纹理,简单的理解就是一副图像。而把一副图像映射到图形上的过程,叫做纹理映射。
什么是混合
在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体的混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。
什么是OpenGL上下文(Rendering Context)
如何理解“上下文”:比如在一篇文章中,我们看到一句话:“他飞快的跑了出去。”但是如果我们不看上下文的话,我们并不知道这句话究竟是什么意思:谁跑了出去?他是谁?他为什么要跑? 写计算机理解的程序语言跟写文章是相似的,我们运行任何一段语句都需要有这样一个“上下文”的存在。
从另外一个角度去想,“他飞快的跑了出去。”这句话也属于文中内容,所以它也属于“上下文”。
而上下文在书中仅有一份,我们可以把它做成状态机,小说的任何一个部分的内容都可称为状态。
什么是渲染(Rendering)
将图像数据转换成3D图像的操作叫做渲染
什么是矩阵、变换矩阵、投影矩阵
首先要明白什么是矩阵,然后要明白矩阵的变换,之后就会明白什么是投影矩阵。
-
矩阵
下图就是矩阵,是初中二年级学的内容,图中包含三个坐标xyz。
A:1,0,5
B:0,-1,2
C:0,0,1
-
矩阵变换
矩阵变换即是矩阵和矩阵的计算,比如加减乘除等。计算结果后得到一个新的矩阵。
-
投影矩阵
也就是很多矩阵在一起被计算成投影到屏幕的坐标。
实际上是将要绘制的对象带入到了不同的坐标系中。我们注意到有这样几个坐标系:
- 模型坐标系:主要用以定义描述绘制对象;
- 世界坐标系:将要绘制的对象放置到世界坐标系中。所有的绘制对象需要一个共同的坐标系来决定对象之间的相对位置。正如一个杯子的坐标,只是用来描述杯子本身的形体,我们还需要把它们放到世界空间中,在它的旁边,可能还有茶壶、桌子等等。
- 视坐标:也叫照相机坐标系,你可以想象我们在那个方向、那个位置放置了一个照相机,也可以说,那是我们眼睛的位置。
- 裁剪坐标系:将区域进行裁剪,有些东西可能在视线之外,就需要裁掉;
- 归一化坐标系:OpenGL 认为它所绘制的区域是一个正方形,每个方向上范围在[-1,1]之间。
- 屏幕坐标系:或者说是窗口坐标系,就是将归一化坐标系投射到实际屏幕上。
更加形象的过程,如下图所示:
什么是渲染上屏/交换缓冲区
常规的OpenGL程序⾄至少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在⼀一个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像在屏幕上的显示。
什么是GLSL
GLSL - OpenGL Shading Language 也称作 GLslang,是一个以C语言为基础的高阶着色语言。它是由 OpenGL ARB所建立,提供开发者对绘图管线更多的直接控制,而无需使用汇编语言或硬件规格语言。
- GLSL 顶点着色器的简单范例
void main(void){
gl_Position = ftransform();
}
- GLSL 片断着色器的简单范例
void main(void){
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
什么是OpenGL状态机
程序跑起来后需要去修改、设置、添加各种不同的状态,使图像按照我们的想法显示出来。状态机中保存了对象的生命周期、响应事件、状态事件等等
文献:
计算机那些事(8)——图形图像渲染原/
Shader | 着色器知多少 | 片段(像素)着色器、顶点着色器、几何着色器
OpenGL ES---矩阵变换
OpenGL图形渲染管线图解