1、图形硬件
GPU(Graphics Processing Unit):
像素和帧
基本所有现代显示器都是基于光栅的,一个光栅是一个像素的2D矩形网格,一个像素有两个属性:颜色和位置。颜色以RGB分量表示--经常8位一个分量或者24位一个像素。位置以(x,y)形式表示。原点(0,0)在左上角,如下图所示:
每个像素的颜色位数成为显示器深度,矩形网格的行列数成为显示器的分辨率,比如640*480(VGA), 1024*768(VGA)....
帧缓存和刷新率
像素的颜色值存储在称为帧缓存的图形内存中。GPU将颜色值写入到帧缓存。显示器次用做到右,从上到下逐行从帧缓存读取颜色值,并将每个值显示在屏幕上,这称为光栅扫描。显示器每秒刷新屏幕数十次,称为刷新率,对于LCD显示器一般是60HZ。
双缓存和垂直同步
当显示器从缓存读取数据显示到当前帧的时候,我们可能正在为下一帧更新内容,这样就导致屏幕一部分显示新帧和一部分旧帧的内容,真就是所谓的撕裂。
双缓存可以解决此类问题,不使用单帧缓存,而是使用两个缓存:前缓存跟后缓存。 显示器从当前缓冲区读取,而我们将下帧写到后缓存区。完成后,我们像GPU发出信号交换前后缓冲区。
单独使用双缓存并不能解决整个问题,因为缓存区交换可能发生在不适当的世界,例如,在显示器处于显示旧帧的中间时,这就需要通过光栅扫描结束时候成为垂直同步(VSYnc)来解决。当我们向GPU发出信号进行缓存交换时, 在显示整个当前帧之后,GPU将等待下一个VSync进行实际交换。
需要注意的是:当VSync缓存交换使能后,你不能以比显示屏刷新率更快速度刷新。对于LCD、LED显示器,通常刷新率是60HZ。或者每帧16.7ms。此外,如果以固定帧率刷新应用程序,你最终的刷新率很可能是显示器刷新率的整数因子,比如1/2, 1/3, 1/4等。
2、3D渲染管线
需要补充一些OPenGLES的可编程渲染管线:
3D图形渲染管线主要包括以下几部分:
1、顶点处理
2、光栅化
3、Fragment Processing
3、输出合并
3、顶点、图元、Fragment和像素
3.1 3D图形坐标系
openGL是右手坐标系,x轴朝右,y轴朝上,z轴指向显示器外。Direct3D是左右坐标系,z轴相反。本文采用opengl的RHS和CCW。
3.2 图元
3.3 顶点
顶点索引
3.4 像素和Fragment
4
https://www3.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html