首先我们来观察下面的一张结构图:
注释:
- Client:它是指CPU上所存储的代码,我们叫客户端。比如,我们会用到OpenGL的代码,C代码,C++代码
- Server:提供OpenGL的底层渲染服务
- Texture Data:纹理数据
- Uniforms:
- Attributes:属性
- Vertex Shader:顶点着色器
- Position Vertex:顶点数组
- Primitive Assembly:图元装配
- Fragment Shader:片元着色器
- Render:渲染
通过这张图我们可以了解到:通过代码的调用OpenGL的API可以把CPU解码后的数据传递给OpenGL底层的顶点着色器和片元着色器,从而完成图片的渲染和显示。
那么,我们有几种传递数据的通道?以及每种通道是如何工作的呢?
下面我们逐一介绍一下向OpenGL传递数据的三种通道:
- Attributes
只能直接往顶点着色器中传递数据,可以通过顶点着色器间接传递到片元着色器
可传递的内容有:
顶点数组
投影矩阵,模型矩阵等
纹理坐标:(图片映射坐标),主要是通过顶点着色器桥接给片元着色器
- Uniforms
即可直接往顶点着色器中传递数据,又可直接往片元着色器中传递数据
可传递内容:
一般传递批次的,统一的,不常变的数据
也可传递其他常变的内容,但不建议这样做
- Texture Data
同Uniforms,即可直接往顶点着色器中传递数据,又可直接往片元着色器中传递数据
可传递内容:
纹理数据
虽然说可以往顶点着色器中传递,但是顶点着色器不会使用这些数据,所以最好还是传递给片元着色器
总结:虽然三种通道都可以传递数据,但每种通道都有比较适合的传递对象以及传递数据内容,使用过程中还是要尽量选择使用最优的通道。