[GLES]|[GLES] 固定管线与可编程管线的差别

材质球素材来自CSDN的u010345749所撰写的常用的光照模型Shader Models。
1 什么是渲染管线
渲染管线又称渲染流水线,它是图形图像从数据一步一步形成最终输出的画面所要经历的各种操作过程。数据经过一个操作后,被处理成下一个步骤需要的数据,最终一步一步整合成拼凑最终画面的元素。
通常来讲,以下两个大步骤是必要:
  • 顶点渲染:用于渲染出形状
  • 像素渲染:在形状中填充色彩
所以你可以简单地认为,渲染管线就是:

[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
1.1 顶点渲染 顶点渲染就是把顶点中的各种数据变换、过滤、插值......成最终要显示要画面上形状的过程。
顶点中包含:
  • 位置
  • 纹理坐标(可选)
  • 顶点颜色(可选)
  • 法线(可选)
    复杂的顶点数据就是我们常见的模型,如下图展示出来的三个模型:立方体、Open文字、GL文字

    [GLES]|[GLES] 固定管线与可编程管线的差别
    文章图片
    原始模型
最常见的一个顶点渲染操作就是把模型上的位置和MVP矩阵相乘,得到最终显示在画面的模型点:
V' = V * MVP
MVP矩阵的作用就是把一个处于自身坐标系中的模型的每个点都按照相同的方式依次偏移到新的位置上去,让模型看起来被移动、旋转、缩放甚至变形了。 模型按照一定规则被移动、旋转、缩放甚至变形新的位置上后,我们称这个模型被MVP矩阵变换了。
举个例子,上图中的三个原始模型经过变换后,重新排列了它们的位置、大小和角度,形成了下图中新的造型:

[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
变换后的模型
当模型上所有的点都变换到矩阵指定的位置上后,这些位置上的点所组成的面就形成了下一步需要被填充色彩的形状。这个形状严格意义上来讲是看不见的,因为它们只是些形状的边界,就像下图这样,等待像素渲染阶段来为这些边界中的部分上色。

[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
顶点渲染后 1.2 像素渲染 对顶点渲染中形成的形状进行色彩填充的过程就是像素渲染。在这个过程中,被填充的色彩可以来自于顶点颜色、纹理甚至是通过某些数值计算出来的色彩(如光照)。
渲染颜色时,我们通常需要材质和光照来作为色彩的来源,然后通过某种光照模型(光照公式)来计算材质和光照在模型上的不同位置会形成什么样的颜色。顶点渲染之后产生的形状被上色后,可以被涂抹成下图的样子,基本上这就是我们最终在屏幕上看到的样子了。

[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
像素渲染后 像素渲染时,通常会使用光照模型来模拟出模型被光线照射后的样子,常见的光照模型有:
  • Phong
    用于计算表面光滑的材质的表面色彩
  • Lambert
    用于计算具有磨砂表面的材质的表面色彩
  • Bline
    用于计算具有高高反射率或折射率的材质的表面色彩
  • Cook-Torrance
    用于计算皮革等容易混合自身材质颜色且非漫反射色到高光中的材质的表面色彩
  • Strauss
    用于计算金属球表面亚光的表面色彩
  • ANisotropic
    用来计算类似猫眼石或者金属拉丝的高光反射、折射效果
  • Constant
    用于计算只使用漫反射的颜色的材质的表面色彩
光照模型中,对光的来源也有具体的描述,通常我们需要光照中包含:
  • 光的颜色
  • 光的亮度
  • 光的衰减系数
  • 光源的位置
  • 光的照射方向
  • 光的照射范围
模型的材料会对不同的光照产生不同的反应,所以对模型的材质的描述通用会包含:
  • 顶点颜色
    定义模型的颜色,也可认为它是漫反射色或自发光色
  • 漫反射色
    定义模型被自然光照射时反射的颜色PHong
  • 高光色
    定义模型被自然光照射时,光滑部分反射出来的高亮光颜色
  • 高光系数
    定义模型表面的光滑程度,系数越高越光滑,高光就越集中越亮
  • 反射率
    定义模型表面对光照的反射程度
  • 折射率
    定义模型材质对光线的折射率,从而得出透射光和反射光的强度
  • 透明度
    定义模型的透明程度
不同的光照模型(光照公式)会取用不同的参数来计算模型上每个点组成的面中的每个像素的颜色,最终组成一幅能够在屏幕上显示的画面。下图展示了不同的光照模型使用一些典型的光照和材质后渲染出来的样式:

[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
光照模型 2 渲染管线的种类
根据渲染管线的类型,OpenGLES可以被分为两类:
  • 固定管线
  • 可编程管线
2.1 固定管线 固定渲染管线的OpenGLES不需要也不允许你自己去定义顶点渲染和像素渲染的具体逻辑,它内部已经固化了一套完整的渲染流程,只需要开发者在CPU代码端输入渲染所需要的参数并指定特定的开关,就能完成不同的渲染。
OpenGLES 1.x版本就是固定渲染管线的版本。现有的OpenGLES 1.x版本有:
  • OpenGLES 1.0
  • OpenGLES 1.1
下图是固定渲染管线的流程图,OpenGLES内部从取到数据开始,会经历下列的步骤最终形成可显示的画面。图中橘色的部分在可编程渲染管线中会被替换成可编程的顶点渲染部分(Vertex Shader)和像素渲染部分(Fragment Shader)。
[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片
2.2 可编程管线 可编程渲染管线的OpenGLES版本必须由开发者自行实现渲染流程,否则无法绘制出最终的画面。开发者可以根据自己的具体需要来编写顶点渲染和像素渲染中的具体逻辑,可最大程度的简化渲染管线的逻辑以提高渲染效率,也可自己实现特定的算法和逻辑来渲染出固定管线无法渲染的效果。具有很高的可定制性,但同时也对开发者提出了更高的要求。
OpenGLES 2.0及其以上的版本则为可编程渲染管线的版本。目前具体的OpenGLES版本有:
  • OpenGLES 2.0
  • OpenGLES 3.0
  • OpenGLES 3.1
【[GLES]|[GLES] 固定管线与可编程管线的差别】下面OpenGLES管线流程图中展示的橘色部分就是必须由开发者自行编程的部分,顶点渲染部分(VertexShader)用于处理模型的形状给后续的步骤输出一个用于填充色彩的像素区域,像素渲染部分(Fragment Shader)用于在模型的每个面上(经过顶点渲染处理过的面)逐像素填充色彩。
[GLES]|[GLES] 固定管线与可编程管线的差别
文章图片

    推荐阅读