OpenGL

第四节—OpenGL渲染流程

2020-04-30  本文已影响0人  L_Ares

本文为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渲染流程架构图的知识点归纳完毕。

上一篇下一篇

猜你喜欢

热点阅读