OpenGL 渲染流程图解析
OpenGL 渲染使用客户端<——>服务端的形式实现,客户端是我们编写的代码,服务端是计算机图形硬件厂商所提供的OpenGL实现。
由上图可见,渲染管线分为上下两个部分,上面一部分是客户端,下面一部分是服务端。
-
Client 客户端
客户端是存储在 CPU 存储器中的,并且在应用程序中执行,或者在主系统内存的程序中执行。会将渲染命令和数据组合起来发送给服务器执行。 -
Server 服务端
实际上就是OpenGL中直接操作 GPU 绘制图形的部分。Client 和 Server 是独立异步执行的,分属不同的软件块或硬件块。 -
通道
OpenGL API 向 GPU 传递数据有三个通道:-
Attributes
属性 Uniforms
-
Texture Data
纹理数据。
-
-
attribute 属性
传递的是不断发生改变的数据,只能传递到顶点着色器,不能直接传递到片元着色器,可以通过 GLSL 代码间接传递。
传递的数据包括:- 颜色数据
- 顶点数据
- 纹理坐标
- 光照法线
-
uniform 值
传递的是统一的数据,如旋转矩阵、变换矩阵等,可以直接传递到片元着色器和顶点着色器。
视频解码渲染使用到的颜色空间是 YUV 颜色值,需要将 YUV 乘以转换矩阵转换成 RGBA。
顶点着色器的常量数据不能被着色器修改,一般用于对统一组顶点组成的单个 3D 物体中所有顶点都相同的变量,如当前光源的位置。 -
Texture Data 纹理数据
主要应用场景- 滤镜:对图片本身进行处理,改变图片在读取时的颜色值。
- 渲染一个图形:正方体:线框填充、颜色填充、纹理填充(多张)
-
Position Vertex 顶点位置
顶点着色器执行顶点的变换结果- 颜色
- 法线
- 纹理坐标
-
Primitive Assembly 光栅化
光栅化不能被操作,我们只能操作顶点着色器和片元着色器。 -
Outs 输出
将数据从一个阶段传递到下一个阶段,开发者无法参与干预其过程 -
Render 渲染
渲染图形