说到渲染流程,我们可以用一张图,清楚的看到渲染的一系列流程。废话不说,看图(图片取自Tobesky的一篇文章)
这样图非常重要,处理任何图形渲染,都需要依据这张图的流程。下面我们来细细说明这张图表达的意思。
客户端/ 服务端
Client(客户端)/ Server(服务端。在我们日常开发中手机端称为客户端,后台称为服务端。在这里是要区分开来的。图中虚线分为上下两部分,上半部分是客户端,下半部分为服务端。
客户端
是存储在CPU存储器中的,并且在应用程序中执行,或者在主系统内存的驱动程序中执行(我们写的代码,OpenGL 提供的API就是在客户端执行)
服务端
驱动程序会将渲染命令和数组组合起来,发送给服务器执行。(在一台典型的个人计算机上,服务器就是实际上就是图形加速卡上的硬件和内存)
着色器
顶点着色器(Vertex Shader)和 Fragment Shader(片元着色器)和图元装配(primitive Assembly)
- 着色器是使用GLSL编写的程序
- 顶点着色器计算顶点数据在交由图元装配对每个片段进行光栅化,最后片元着色器会输出我们将屏幕上看到的最终颜色值。
3种向OpenGL 着色器传递渲染数据的方法
1.属性
2.uniform 值
3.纹理
属性
- 对
每一个顶点
都要作改变的数据元素 - 属性值可以是
浮点数、整数、布尔数据
- 属性还可以是:
纹理坐标、颜色值、关照计算表面法线
-
属性只提供给顶点着色器使用
,对于片元着色器木有太大意义 - 属性可以通过顶点着色器,间接传递给片元着色器
Uniform值
- uniform变量可以
无数次
地使用 - uniform 变量
每个批次
改变一次,而不是每个顶点改变一次 - uniform变量最常见的应用是在顶点渲染中设置
变换矩阵
- 与属性相同点:可以是
浮点值、整数、布尔值
- 与属性不同点:顶点着色器和片元着色器都可以使用uniform变量。uniform 变量还可以是
标量类型、矢量类型、uniform矩阵
纹理
- 在顶点着色器、片段着色器中都可以对纹理数据进行采样和筛选
- 典型的应用场景:片元着色器对一个纹理值进行采样,然后在一个三角形表面应用渲染纹理数据
- 纹理数据,不仅仅表现在图形,很多图形文件格式都是以无符号字节(每个颜色通道8位)形式对颜色分量进行存储的
输出
在图表中第四种数据类型是输出(out)
;输出数据是作为一个阶段着色器的输出定义的,二后续阶段的着色器则作为输入定义。
- 输出数据可以简单的从一个阶段传递到下一个阶段,也可以用不同的方式插入。
- 客户端的代码接触不到,这些内部变量OpenGL开发暂时接触不到。