第四节—OpenGL渲染流程
本文为L_Ares个人写作,包括图片皆为个人亲自操作,以任何形式转载请表明原文出处。
一、OpenGL渲染流程架构图解析
首先,明确一下OpenGL的渲染流程是一个怎样的管线。如下图:
着色器的渲染流程.png这其中包含了数据的传入,那么数据是通过什么通道传输到什么端,不同端又带有怎样的特性,会进行什么样的处理,这就是下图显示的OpenGL渲染流程架构图阐述的。如图:
OpenGL渲染流程架构图.png图中的 (1)TextureData (2)Uniforms (3)Attributes 只是传递数据的通道。
下面逐一的介绍这三个通道的作用和特点。
1. Attributes
利用Attributes通道的数据只能传递到VertexShader,也就是顶点着色器,是通过GLSL代码的方式间接的传递。
经常要发生改变的值通常使用Attributes通道来进行传递。
例如:顶点坐标、颜色、位移、纹理坐标、光照法线等。
数据类型上面,可以是int、bool、float,也可以是四维向量等等。
总结:就是不断发生改变的数据通常走这条通道。
2. Uniforms
利用Uniforms通道的数据可以传递到VertexShader和FragmentShader,也就是顶点着色器和片元着色器。
与Attributes相反,通过Uniforms通道进行传递的数据都是比较稳定的,比较有统一,有制式的,不会经常的发生改变。
我们拿旋转来举一个例子。
例1:首先要明确,当一个图形发生旋转,也就是让图形的每个顶点都乘以一个旋转矩阵,即:顶点 * 旋转矩阵
。这个过程发生在VertexShader中,那么在Uniforms在Fragment中的例子是什么样子的呢?
例2:在Fragment中,利用Uniforms通道传递数据有很常见的例子,比如视频。
视频渲染到屏幕上的大体流程如下:
视频--->经过解码--->变成一帧一帧的图片--->利用OpenGL/ES或Metal渲染--->显示
视频本身的颜色排列方式是YUV
方式,但是想要显示在屏幕上,就需要使用RGBA
的颜色排列方式,我们就需要将YUV
的颜色值转换成RGBA
的颜色值:YUV * 颜色转换矩阵 = RGBA
。
那么在上述的例1与例2中,两个转换的矩阵,旋转矩阵和颜色转换矩阵就可以通过Uniforms通道进行传递。
总结:就是不怎么需要发生改变的数据通常走这条通道。
3. TextureData
TextureData可以传输到VertexShader中,但是这种方式极为的不常用,而且这是通过间接传递完成的,必要性不大。
TextureData通道主要还是纹理传递通道,传输的另一端是FragmentShader。
我们都知道图片就是一种纹理,下面我拿图片来举例。
例3:比如做滤镜的时候,需要利用纹理数据对图片的本身进行处理,而且滤镜改变的仅是图片本身的颜色值。
例4:渲染图形。比如填充线框/颜色/纹理。这个过程可以使用多张纹理,获取它们的颜色,然后完成填充。
图中的Outs(输出)
和Primitive Assembly(图元装配/光栅化)
是OpenGL开发者没有办法直接参与或者干预的过程,不再多做解释。
那么在这个流程架构图中,其实OpenGL开发者可以干预到的就只是VertexShader和FragmentShader。
二、OpenGL可以实现跨平台的原因
从流程中也可以看出,OpenGL只负责把数据传输到显示层,具体谁来显示,并没有明确的交代,而且OpenGL也没有提供窗口系统。这就是OpenGL可以实现跨平台的原因。
三、Client和Server的区别
在图中已经有标明,Client是我们利用代码获取或者预置数据的编写区域,还是API调用区域,主要调用的是CPU进行代码的处理。
Server则是利用GPU进行数据传递和渲染的区域。
如下图:
OpenGL渲染流程执行位置.png至此,本节关于OpenGL渲染流程架构图的知识点归纳完毕。