- 在什么地方进行绘制?
- 绘制成什么形状?
- 用什么颜色来绘制?
而我们的程序也主要以解决上述三个问题为主,下面以 OpenGL 绘制一个点来讲解。
OpenGL 坐标
手机屏幕的坐标是以左上角为原点(0,0),向右为 X 轴正方形,向下为 Y 轴正方向,而 OpenGL 也有着它自己的一套坐标定义。
假设我们定义了一个点的坐标(4.3,2.1),也就是它的 X 轴坐标和 Y 轴坐标,而 OpenGL 最后会把我们定义的坐标映射手机屏幕的实际物理坐标上。
无论是 X 坐标还是 Y 坐标,OpenGL 都会把手机屏幕映射到 [-1,1] 的范围内。也就是说:屏幕的左边对应 X 轴的 -1 ,屏幕的右边对应 +1,屏幕的底边会对应 Y 轴的 -1,而屏幕的顶边就对应 +1。
不管屏幕是什么形状和大小,这个坐标范围都是一样的,例如下图所示:
所以,上面定义的坐标(4.3,2.1),最后是会被映射到手机屏幕之外的,处于不可见的状态。
这里,假定绘制一个位于原点的点(0,0),那么映射之后的位置就手机屏幕的中心了。
基本图元
解决了位置的问题,接下来就是形状和颜色的问题。
如同 Android 的 Canvas 对象提供了一些方法来完成基本的绘制:drawPoint、drawRect、drawLine 等,OpenGL 程序也提供且仅提供了三种基本的图元来完成绘制。
- 点
- 线
- 三角形
其他的所有形状都是基于这三种图元来完成的,比如矩形就可以看成是两个三角形拼成的。
由于我们要绘制的是一个点,在坐标系中,一个坐标就可以代替一个点了。假设要绘制一个三角形,那么在坐标系中就需要三个点才行了。
接下来就涉及到 OpenGL 如何把定义的点的数据绘制出来了。
渲染管线
首先要明白一个概念渲染管线
。
根据百度百科的定义,渲染管线也称为渲染流水线
或像素流水线
或像素管线
,是显示芯片内部(GPU)处理图形信号相互独立的并行处理单元。
显卡的渲染管线就是显示核心的重要组成部分,是负责给图形配上颜色的一组专门通道。渲染管线的数量是决定显示芯片性能和档次的最重要的参数之一。
现阶段的显卡都是分为顶点渲染
和像素渲染
的。在显卡,内部分为两大区域,一个区域是顶点渲染单元(也叫顶点着色),主要负责描绘图形,也就是建立模型。一个区域是像素渲染管线,主要负责把顶点绘出的图形填上颜色。
上图就是 OpenGL 中渲染管线的一个处理流程。
可以看到,流程图从读取顶点数据开始,然后后执行两个着色器:
- 顶点着色器
- 主要负责描绘图形,也就是根据顶点坐标,建立图形模型。
- 片段着色器
- 主要负责把顶点绘出的图形填上颜色。
由于这两个着色器对于最后图形显示效果至关重要,并且它们还是可以通过编程来控制的,这也是为什么可编程渲染管线
要优于固定编程管线了。
事实上,随着显示技术的发展,渲染管线将不复存在了,顶点着色器和渲染管线统一被流处理器(Stream Processors)
所取代。
但是目前手机上 OpenGL 还是使用渲染管线中,有了渲染管线,我们就可以完成点的形状绘制和着色两大问题了,接下来的工作也是围绕这条渲染管线开始的。