在OpenGL中,任何事物都处在3D空间,而屏幕和窗口是2D像素组。这导致OpenGL大部分时间都在处理把3D数据转变为适应屏幕的2D像素。3D到2D的过程被称为OpenGL的图像渲染管线(即管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)。
图形渲染管线可以被划分为几个部分,每个阶段把前一阶段的输出当作自己的输入。每个阶段都是高度专门化的,有特定的函数实现,并且很容易并行执行。正是由于它们具有并行执行的特性,当今大多数显卡都有成千上万的小处理核心,它们在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。
一、顶点数据
一系列图形顶点的集合。
有了顶点数据,OpenGL其实还是不知道我们要做什么样的图形。为了告诉OpenGL我们要做什么,我们会给这些数据指定一些渲染类型,到底是点、三角形还是线。我们所给的这个提示被称为图元。常用的图元有:GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。
这里的输入采用的是标准化设备坐标,即xyz的值的范围只能是在-1到1之间。
二、顶点着色器
这是管线的第一部分。它把一个单独的顶点作为输入,然后把这个3D坐标转换为另一种3D坐标,同时开发人员还可以再做一些基础处理。
三、图元装配
将顶点着色器输出的的所有顶点作为输入,并根据指定的图元装配成相应的图形。
四、几何着色器
将图元装配的输出作为输入,它可以通过产生新顶点构造出新的(或是其它的)图元来生成其他形状
五、光栅化
把图元映射为最终屏幕上相应的像素,生成供片段着色器(Fragment Shader)使用的片段(Fragment)。在片段着色器运行之前会执行裁切(Clipping)。裁切会丢弃超出你的视图以外的所有像素,用来提升执行效率。
六、片段着色器
计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。
七、测试与混合
这个阶段检测片段的对应的深度(和模板(Stencil))值(后面会讲),用它们来判断这个像素是其它物体的前面还是后面,决定是否应该丢弃。这个阶段也会检查alpha值(alpha值定义了一个物体的透明度)并对物体进行混合(Blend)。所以,即使在片段着色器中计算出来了一个像素输出的颜色,在渲染多个三角形的时候最后的像素颜色也可能完全不同。
在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。
着色器:是运行在GPU上的小程序,这些小程序为图形渲染管线的某个特定部分而运行
总结
整体的流程总结如下:
1、初始化GLFW
2、配置GLFW
3、创建窗口对象GLFWwindow
4、将创建的窗口对象设置为当前上下文context
5、初始化GLEW
6、可视化窗口
7、图形渲染管线:VAO、顶点数据、连接顶点属性、启用顶点属性、VBO、Vertex Shader、Fragment Shader、Shader Programe、删除Shader
8、绘制