iOS OpenGL开发(二) - 着色器渲染流程

1,169 阅读4分钟

OpenGL

前言

第一篇我们提到了很多的着色器相关的名词,那么什么是着色器呢?着色器他们又有一个什么样的流程呢?着色器分哪些种类呢?不同的着色器分别有什么功能呢?我们就带着这些问题,开启我们这一片文章的内容。

1、着色器的基本认识

讲到着色器,我们首先提到的应该会图元,那么什么是图元呢?

图元:组成图像的基本单元。

那么说完图元,我们就要说说渲染管线了,怎么理解渲染管线呢?

OpenGL渲染管线:一系列有序处理阶段的序列,用于把我们应用中的数据转化到OpenGL生成一个最终的图像的一个过程。

怎么理解?其实我们可以把管线想象称为一个流水线,流水线上面的每个过程都是固定好了的,顺序不能错乱的,那么我们把流水线上面的一个工人或者是机器设备就可以理解为一个着色器。那么我们怎么去指挥流水线工人或者是流水线上的机器干活呢?我们就需要有一种交流沟通的命令,这个命令我们就可以理解为是专门为图形开发设计的编程语言,也就是我们常说的GLSL

2、着色器的分类

  • 顶点着色器(必要):是最初用来处理顶点坐标的,一般会对坐标做一些计算
  • 细分着色器(可选):描述物体的形状,在管线中生成新的几何体处理(平顺)模型生成最终形态
  • 几何着色器(可选):是对原坐标进行一些修改,个人感觉适用于一些特效
  • 片元着色器(必要):是对图形进行涂色,并最终输出 其中顶点着色器和片元着色器是我们必须要要使用的,然而细分着色器和几何着色器我们是可选的,一般用的很少。

3、着色器的渲染流程

第一节里面提到了渲染管线,其实我们可以理解就是着色器的渲染流程。下面一幅图就是着色器的渲染流程

着色器渲染流程
流程:

  • 拿到顶点数据传给顶点着色器,顶点着色器根据你的投影等等不同的情况进行处理一番
  • 顶点着色器处理完了之后交给细分着色器,生成新的几何体处理(平顺)模型生成最终形态,对所有的图像进行修改几何图元类型或者放弃所有的凸缘
  • 然后交给几何着色器对原坐标进行一些修改(一般用于特效方面的)
  • 接着进行图元设置,其实可以理解为描述图片到底长啥样
  • 接下来进行剪切,剪切顾名思义就是剪切视口之外的绘制
  • 下面就是光栅化,光栅化就是输入图元的数学描述,转化为与屏幕对应的位置像素片元。其实很好理解,就是把这个图片切成一个个的像素点然后交给片元着色器
  • 片元着色器就会处理每一个像素点,给每一个像素点进行着色,其实就是片元颜色以及深度值传递到片元测试和混合模块。所以说有多少个像素点就要执行多少次片元着色器。

4、管线

其实我们通俗的理解,上面说的这个流程就是管线。管线也是分两类的:

  • 固定管线:OpenGL刚出来的时候,大家都是用的固定管线,就是所有的流程都是固定死了的,你就只能按照这个顺序来,中间的过程你不用管。但是随着后面的业务场景越来越丰富,固定管线已经无法满足需求了,于是出现了可编程管线。
  • 可编程管线:顾名思义就是可以编程的管线,那么哪一些着色器是可以编程的呢?到目前为止,我们能够通过GLSL语言编程的着色器是顶点着色器和片元着色器。