GPU渲染原理

GPU渲染原理

渲染管线

何为渲染管线

渲染管线,就是 CPU 传送给 GPU 一堆数据(顶点、纹理等),经过一系列处理,最后渲染得出来一副二维图像。

过程分析

应用程序阶段

主要是粗粒度剔除、渲染状态设置、准备数据等工作,这里实在CPU上干的,后面都在GPU上处理。

顶点处理阶段

顶点着色器、曲面细分、几何着色器、顶点裁剪、屏幕映射,这里会做背面剔除等裁剪,确保只有真正需要绘制的图元才会进入光栅化。顶点处理是可编程的(Vertex Shader,Geometry Shader 和 Compute Shader)。

光栅化阶段

光栅化引擎会将图元(Primitive)映射为与屏幕像素对应的片元(Fragment)。片元包含每个像素的坐标、颜色、深度、法线、导数、纹理坐标等信息。这个数据经过片元着色器的计算得到最终的颜色值,像素处理是可编程的(OpenGL 中叫做片元着色器,Fragment Shader,DirectX 中叫做像素着色器,Pixel Shader)。这里通常是性能瓶颈所在,所以现代 GPU 做了很多的优化来尽可能避免执行无效的像素处理,比如 EarlyZ、隐面剔除等。

逐片元操作

光栅化阶段得到的颜色值通过裁剪测试、深度测试、模板测试、混合最终写入到 FrameBuffer 中。ROP (Raster Operations),是由一个独立的硬件单元来完成的。这个硬件单元的数量和性能限制了 GPU 每秒写入 FrameBuffer 的数据量。在一些低端机这个阶段也非常有可能成为性能瓶颈,即每秒 ROP 处理数据量。即便使用最简单的全屏半透明 shader,多叠加一两层就会因 overdraw 而严重降帧,很有可能就是 ROP 瓶颈。

典型框架

IMR( Immediate Mode Rendering)框架

主要过程如下
在这里插入图片描述上图展示了一个非常经典的 IMR 渲染管线,也是桌面端最常见的 GPU 架构。GPU 会在每个 drawcall 提交中,按照管线的顺序处理每个图元。

优势

其优势是渲染管线没有中断,有利于提高 GPU 的最大吞吐量,最大化的利用 GPU 性能。同时从 vertex 到 raster 的处理都是在 GPU 内部的 on-chip buffer 上进行的,这意味着只需要很少的带宽(bandwidth),就可以存取(storing and retrieving)处理过程中的图元数据。所以桌面 GPU 天然就可以处理大量的 DrawCall 和海量的顶点。而移动端 GPU 则对这两者异常敏感。这不仅仅是 GPU 性能差异,架构差异也至关重要。

劣势

IMR 是全屏绘制的。当前绘制的图元可能存在于屏幕的任何位置。这意味着我们需要一个全屏的 FrameBuffer。这个 buffer 的内存很大,所以只能放在系统内存(DRAM)中。而在光栅化之后的 fragment shading, depth testing, stencil testing, blending 等阶段,都会大量的与系统内存进行交互,消耗大量的带宽。GPU 的 L1/L2 缓存可以缓解这个问题,但是对于移动端,依然是不可接受的开销。

TBR( Tile-based Rendering)框架

主要过程如下

在这里插入图片描述

为什么要使用 TBR 架构

对移动端设备而言,控制功耗是非常重要的。功耗高意味着耗电、发热、降频,这会导致我们的游戏出现严重的卡顿或者帧率降低。带宽是功耗的第一杀手,大量的带宽开销会带来明显的耗电和发热。移动端 GPU 的带宽本来就跟桌面端 GPU 不是一个量级,又无法像独立显卡一样独占大量带宽,所以减少带宽开销变得异常重要。因此移动端 GPU 普遍使用的是 TBR/TBDR 架构。

原理

TBR 跟 IMR 不同之处在于,它并不是基于全屏直接绘制。而是把屏幕分成一个一个的 Tile,GPU 一次只绘制一个 Tile。绘制完毕再将绘制结果写入到系统内存的 FrameBuffer 中。
TBR 架构的绘制过程分成两个部分
第一步,处理所有顶点,生成一个 tile list 的中间数据(FrameData)。这个数据保存了每个图元归属于哪个屏幕上的 Tile。PowerVR 一个 Tile 是 32x32 大小,而 Mali 则是 16x16 大小(即将发布的 Mali-G710 也修改为 32x32 大小了)。
第二步,针对每个 Tile 执行像素处理过程(光栅化、片元着色器等),每个 Tile 处理完毕,将结果一起写入到系统内存中。

优势

TBR 架构最大的优势就是减少了对主存的访问,也即减少了带宽开销。每个 Tile 足够小,其 framebuffer 是可以做到 on-chip memory 上的。on-chip memory 紧挨着 GPU 的 shader core,访问速度极快。不仅仅是 fragment shader,depth testing、blending 等操作也是在 on-chip memory 进行的。大幅减少像素处理阶段对系统内存的访问。还有一个明显优势是,depth buffer 和 stencil buffer 只在 Tile 处理内部有用。它们是不需要写回系统内存的,这进一步节省了带宽开销。TBR 架构里,一些原本非常昂贵的,消耗大量的带宽的算法,会变得高效起来。比如 MSAA (Multi-Sample Anti-Aliasing)。

劣势

GPU 要处理所有的顶点,生成 tile list,然后才可以进行光栅化。跟 IMR 相比,这里会有明显的“延迟(latency)”。生成的这个 tile list 数据是要存到系统内存中的。这同样会有带宽开销,顶点越多,计算的压力就越大,带宽消耗也会越多。像曲面细分(tessellation),在 TBR 架构下就异常的昂贵。所以移动端游戏对顶点数量更加敏感。如果顶点数量过大的话,会导致性能严重下降。

TBDR:(Tile-Based Deferred Rendering)框架

主要过程如下
在这里插入图片描述

原理

TBDR 和 TBR 模式基本类似,唯一的区别在于,多了一个 隐面剔除(Hidden Surface Removal) 的过程。就是上图中 HSR & Depth Test 这个步骤。通过 HSR,无论以什么顺序提交 drawcall,最终只有对屏幕产生贡献的像素会执行像素着色器。被遮挡的片元会被直接丢弃掉。不同的 GPU 有自己的隐面剔除技术,比如 PowerVR 就是 Hidden Surface Removal (HSR),Adreno 就是 Low Resolution Z (LRZ),Mali 就是 Forward Pixel Kill (FPK)。其原理和实现各不相同,不过最终目的都是为避免执行无效的像素着色器。

框架分析

IMR 是桌面端 GPU 的主流架构。NVIDIA 较新的显卡也部分支持了 Tile based 的特性。不过这个 Tile 是较大的 Tile,而不是像 Mali 芯片这样 16x16 的小 Tile。
TBR 是移动端 GPU 的主流架构,通过拆分成一个个 Tile 绘制,减少与主存的交互,进而减少带宽开销。
TBDR 一开始专指 PowerVR,其光栅化之后并不是立即渲染,而是多了隐面剔除的过程。后来 Adreno 和 Mali 也分别提出了自己的隐面剔除方案。所以认为现在的移动端 GPU 都是 TBDR 架构也不为过。

参考链接

https://developer.samsung.com/galaxy-gamedev/resources/articles/gpu-framebuffer.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值