1 简介
1.1 像素
屏幕是由许多小的方格组成,这就是我们常说的像素,由于方格很小很小,所以看上去像一个“点”。例如屏幕的分辨率为1080p(1920x1080),则该屏幕的像素的个数为: 1920 x 1080=2,073,600(约2兆个);一张图像格式为RGBA8888的1080p图像(未压缩)占用内存为:2M x 4byte = 8Mb
1.2 Rendering pipeline(渲染流水线)
图形是按照一定的步骤渲染出来的,下图是一张简易的pipeline流程图,省略了tessellation以及geometry shading两部分,它们只有在必要场合下才会用到,关于这两个部分下次再做介绍。
其中,VAO是指vertex array object,包含vertex buffer object(VBO)和index buffer object(IBO)。color, depth, stencil三种attachment是绑在framebuffer上的,color attachment可以有多个,depth与stencil attachment最多只能各有一个。
1.3 屏幕上显示的三角形是怎么画出来的
数据buffer----位置点(vertex shading)----拼三角形图元----光栅化----着色(fragment shading)----显示
1.3 渲染模式
桌面端计算机主要考虑性能,并且芯片面积相对于移动设备可以设计得更大;而移动设备需要兼顾多种因素,功耗、性能、芯片面积,考虑到这两种平台的不同特性,GPU的渲染模式主要划分为immediate mode rendering(IMR)和tile based rendering(TBR),其中IMR主要用于桌面计算机的图形渲染,TBR主要用于移动嵌入式设备的图形渲染。下面将分别介绍这两种模式。
2 IMR
2.1 简介
IMR是指对于每一个draw call,vertex shading做完拼成图元后直接做fragment shading,pipeline不会中断执行。
2.2 IMR的优缺点
2.2.1 优点
架构简单,vertex shading输出的结果经过primitive assembly之后流入fragment shading,这样就不需要额外的内存来存储中间计算结果,并且节省写出、读入的内存带宽。
2.2.2 缺点
每一个draw call执行一次vertex shading和fragment shading,这样如果先渲染距离远的再渲染近的两个二维重叠的物体,先渲染的物体会被后渲染的物体覆盖,就会导致无用的渲染(可以想像两个完全一样的物体,沿着Z方向放在不同的两个位置)。
3 TBR
3.1 简介
TBR是指对于一个FBO, 将其拆成许多小的tile,先执行所有draw call的vertex shading,拼装成相应的图元后,接着对于每一个tile,各用一张链表(polygon list)来记录位于该tile中的图元;然后对于每一个tile中的每一个图元进行光栅化和fragment shading。
3.2 TBR的优缺点
3.2.1 优点
第一,节省带宽,将FBO拆成许多小的tile,然后对每一个tile渲染,这样gpu对于每个tile都有一块片内的memory来保存渲染的结果,片内memory的优势是访问速度快。第二,相对于IMR而言,先将一个FBO内的所有vertex shading做完,这样就可以知道每个draw call画的物体的相对位置,然后可以利用early zs test 和forward pixel kill来kill掉不必要的fragment,少做一些不必要的fragmet shading,从而大大减小GPU的workload,提高性能和降低功耗。
3.2.2 缺点
vertex shading的计算结果需要存到主存里,fragment shading的时候又需要从主存里读回,所以TBR的主要缺点就是需要额外的空间来存储中间结果,并且相对应地也增加了写入和读回的带宽,这样随着模型精细复杂度的增加,缺点会逐渐暴露出来。
4 小结
桌面设备与主要追求性能,所以主要采用IMR渲染模式,而移动设备GPU的带宽、性能、功率要远低于桌面设备,需要兼顾性能与功耗,从而主要采用TBR模式。与IMR的不同之处在于,TBR会先执行一个FBO里面所有draw call的vertex shading,从而可以知道每个draw call渲染物体的相对深度,大大降低overdraw,从而提高性能,降低功耗。