【渲染】Arm Mali: Tile-Based Rendering
ysh329 opened this issue · comments
Graphics and Gaming Development | Tile-Based Rendering – Arm Developer
https://developer.arm.com/solutions/graphics-and-gaming/developer-guides/learn-the-basics/tile-based-rendering/single-page
基于分块的渲染
本文介绍了基于分块(tiled-based)渲染的GPU优缺点,并拿桌面级的即时渲染模式的GPU在优缺点上进行了比较,以及未来挑战。
Mali-gpu使用基于分片的渲染架构。这意味着GPU渲染过程会将帧缓冲区(framebuffers)输出为几个不同的较小子区域,这些较小子区域称为分块(tile)。完成后将每个分块写入内存,Mali gpu的分块很小,每个分块仅为16x16像素。
即时模式(Immediate Mode)GPUs
传统的桌面级GPU架构通常被称为即时模式架构。该模式将渲染作为一个严格的命令流进行处理,在每次draw
调用中对每个基本体(primitive)依次执行顶点(Vertex)和片段(Fragment)着色器。
下面是对该过程的伪代码示例,忽略并行处理和流水线:
for draw in renderPass:
for primitive in draw:
for vertex in primitive:
execute_vertex_shader(vertex)
if primitive not culled:
for fragment in primitive:
execute_fragment_shader(fragment)
根据伪代码可以看出即时渲染过程是从renderPass
发起,每个readerPass发起一个Draw
绘图调用去绘制每个图元(Primitive),图元在OpenGL中可以是线、三角形等等,具体如下表。对每个图元使用顶点shader绘制顶点,每绘制完一个图元的所有顶点信息后,则绘制该图元的片段信息。从顶点到图元的绘制过程是一个pipeline。
下图展示了即时模式在硬件层面的数据流和内存交互,更能体现出从顶点到图元的绘制过程是一个pipeline**:
下面我们结合上图,分析一下即时模式渲染的优缺点:
优点
顶点着色器和其他与几何体相关的着色器的输出可以保留在GPU内部的芯片上。直到FIFO管道中的下一阶段要用的数据准备好前,这些着色器的输出可以一直存储在FIFO缓冲区中。这意味着GPU使用较少的外部内存带宽来存储和检索中间的几何结果;
缺点
每个绘图(draw)调用中的三角位置都不同,导致片段(Fragment)shader在屏幕上变换位置来执行shader工作。发生这种情况是因为流(stream)中的三角可能覆盖屏幕的任何部分,而三角按绘图调用的顺序处理。
这意味着活动工作集的大小为整个缓冲区的大小。例如,考虑一个1,440p解像度的设备,其颜色使用每象素32位(BPP),包装深度/模具使用32位(BPP)。这就产生了一个30MB的总工作集,这个工作集太大而无法保留在芯片上,因此必须在DRAM中存储在芯片外。
对于每个混合、深度测试和模具测试操作,GPU必须从该工作集获取当前碎片的象素坐标数据的当前值。
一般而言,所有阴影部分都访问此工作集。因此,在高精度下,由于对每个碎片执行多个读-修改-写操作,因此放置在此内存上的带宽负载可能非常高。然而,缓存可以通过将最近访问的部分框架缓冲区保持在接近GPU的位置来减轻高带宽负载。