0201-OpenGL渲染管线
01、OpenGL管线
-
使用OpenGL技术进行图形编程,最终目的是要将三维图形场景展示在二维的屏幕上。OpenGL和DirectX都使用了管线概念的方案,且在管线中,将三维场景转换成二维图形的过程被分割成许多步骤
- 之前介绍过,使用C++语言编写的程序,可以调用OpenGL库接口,并最终运行在CPU上。
- 还需要调用GLSL编写的着色器程序运行在GPU上。
OpenGL图形管线流程
-
OpenGL管线主要阶段包括:顶点着色器 > 图元装配 > 几何着色器 > 曲面细分着色器 > 光栅化 > 片段着色器 > 像素操作
- 其中顶点着色器,曲面细分着色器,几何着色器和片段着色器可以用GLSL编写,并由C++程序载入运行
1、顶点数据传入GPU
-
C++程序通过顶点数组对象(VAO)和顶点缓冲区对象(VBO)将CPU内的顶点数据传入到GPU中
- 如果是三维立体图形,还需要通过顶点索引缓冲数据(EBO)告诉OpenGL这些顶点如何组成图形的
2、顶点着色器处理接收到的顶点数据
- 顶点着色器需要将传入的三维物体坐标投影到像素屏幕坐标,其中主要工作是坐标系的转换、裁剪和映射
- 其中坐标转换包括:物体坐标系(也叫局部坐标)> 世界坐标系 > 摄像机坐标系 > 屏幕坐标系
- 顶点着色器程序有一个预定义的gl_Position变量,用于接收最后的像素坐标
3、图元装配
-
这一步是OpenGL自动完成的,根据用户预先设置的绘制顺序,自动将顶点着色器输出的像素坐标绘制成图元
- OpenGL只能绘制简单的图元,图元包括点、线和三角形,通过绘制这些图元可以最终渲染出负责的场景
- 最后绘制成什么样式的图元,由程序调用的绘制方法(drawArrays)的参数决定
4、几何着色器
-
几何着色器可以让程序员一次操作一个图元的能力,经过上面的图元转配处理后,已经完成了将顶点组合为三角形的过程。
- 几何着色器可以同时访问每个三角形的所有顶点
5、曲面细分着色器
- 曲面细分着色器是OpenGL4.0版本加入的功能,可以生成大量三角形的能力,且通常以网格形势排列
6、光栅化
- 我们要将三维世界中的点、三角形、颜色等最终展示在一个二维的显示器中,这个二维屏幕由栅格(屏幕像素点)组成
- 操作会将之前处理的图元转化为屏幕上的片段(也可理解为像素),并确定了图元绘制的像素位置
- 光栅化操作,会对图元的顶点数据进行插值处理
7、片段着色器
- 片段着色器计算每个片元的最终颜色,决定最终的渲染效果
- 根据法向量和片元位置(gl_FragCoord),以及自定义的物体材质,光源位置,光照模型等,计算片元的最终颜色并输出
8、测试与混合
-
这一步由OpenGL自动完成,判断用户是否开启了深度测试,OpenGL会根据深度(片元距离摄像机的距离)计算
- 摄像机只渲染看得到的片元,如果是被遮挡的物体则不渲染,实现隐藏面消除效果
- 启动深度测试 glEnable(GL_DEPTH_TEST);
- 如果有透明效果,需要进行颜色混合处理
-
总结
-
图形编程,由C++语言编辑的程序和GLSL语言编写的着色器程序完成,要想将三维图形最终渲染到二维屏幕上,需要经过渲染管线流程
-
渲染管线核心流程包括:
- 在程序中使用缓冲区将顶点数据传递给GPU处理
- 顶点着色器顶点数据进行处理,包括坐标变换,裁剪和投影
- 图元装配根据顶点数据绘制成基本图元
- 光栅化操作将装配好的图片转化为屏幕上的片元
- 接着片元着色器对每个片元计算最终的渲染颜色
- 开启深度测试,在屏幕上只渲染未遮挡物体,如果有透明效果,需要进行颜色混合处理
- 曲面着色器和几何着色器使用场景不多,暂不深入