OpenGL渲染架构图介绍
简要解释:
Client客户端:指的是存储在CPU中的一些代码,比如要使用OpenGL API和C/C++的代码。
Server服务端:指的是调用GPU芯片。
Vertex Shader:顶点着色器,管道接收Uniforms、Attributes、Texture Data(纹理数据),三个参数中,但是Texture Data(纹理数据)给顶点着色器实际上没有必要。
Fragment Shader:片元着色器。
Primitive Assembly:图元装配,也就是光栅化。这个是我们OpenGL开发人员无法干预的。
三种数据的介绍:
1、Attributes管道主要是接收经常发生改变的数据,比如颜色数据、顶点数据、纹理数据、光照法线等;Attributes只能传给顶点着色器里面,不能直接传递到片元着色器,需要通过GLSL代码间接传递给片元着色器。
2、Uniforms管道主要是接收比较统一,不经常发生改变的数据,比如旋转矩阵、视频的颜色空间YUV数据;Uniforms既可以传给顶点着色器也可以传递给片元着色器里面。Uniforms类似于constant(静态值)。
3、Texture Data纹理管道。
PS:纹理的用处,其一是滤镜,图片本身就是纹理,对图片做滤镜处理其实就是在读取纹理数据的时候,改变图片的纹理值,比如图片本来是彩色的,在读取纹理值是可以改变成灰度的图片。其二就是在渲染的时候使用纹理填充,在渲染一个图片的时候,比如说一个正方体,可以使用线框填充,也可以使用颜色填充,还可以使用纹理填充,纹理也可以有多张图片,比如两张图片混合之后在填充。
PS:视频解码后,就是一帧帧的图片,然后利用OpenGL ES或Metal将这些图片渲染播放出来。图片的颜色空间用的是RGB,视频的颜色空间使用的是YUV,这中间就需要将YUV数据转化为RGB数据,使用转换矩阵,这个转换矩阵就是要传给片元着色器。
关于客户端和服务端,可以用下面这张图方便理解:
由于OpenGL是基于C的API,因此它非常便携且受到广泛支持。作为C API,它与基于OC和Cocoa应用程序无缝集成。OpenGL提供应用程序用于生成2D或3D图像的函数,应用程序将渲染的图像呈现给屏幕或将它们复制回自己的内存。
OpenGL规范没有提供自己的窗口层,它依赖于OS X定义的功能来将OpenGL绘图与窗口系统集成,应用程序创建OS X。OpenGL渲染下下文并将渲染目标附加到其上(称为可绘制对象)。渲染上下文管理OpenGL状态更改和通过调用OpenGL API创建。