用OpenGL画图的机制可以简化为如下:
1. GPU通过CPU发送的数据构造三维空间(屏幕坐标系)中的顶点.
2. 让这些顶点具有几何特征.
3. 当顶点具备几何特征之后, 就可以确定这些顶点会影响屏幕上面的哪些像素并着色.
其中顶点即为vertex, vertex shader的职能, 其决定每一个顶点是如何通过CPU的数据构造出来的, 这一部分可以通过编程控制.
具备几何特征这一部分和shader无关.
像素就是fragment, fragment shader的职能就是决定顶点如何影响像素的颜色, 这一部分可以通过编程控制.
举个例子:
1. CPU发送数据告诉GPU: "我要在世界坐标系当中的这四个点围成的矩形中填充一个图片, 这四个点分别对应图片的这四个位置."
2. GPU接收数据,通过我们编写好的vertex shader来生成顶点.首先它将这四个点从世界坐标系转换为屏幕坐标系(计算方法当然要你自己写),然后把这四个点准备发送给fragment shader. 每一个顶点有两个信息, 一个是该顶点在屏幕坐标系当中的位置, 一个是该顶点对于图片当中的哪个位置,也称纹理坐标.
3. GPU让这些顶点具有几何属性, 这一步骤叫做装配图元,不是本文的重点, 你只要知道这一步骤会导致这四个点成为一个矩形而不是零星的四个点.
4. Fragment shader 接收来自vertex shader的顶点, 根据opengl内置的一个插值函数, 根据顶点的纹理坐标差值计算出当前像素的颜色.
5. 最后显示频刷新, 我们看到渲染结果.