(四)移动GPU渲染简介

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两部分,它们只有在必要场合下才会用到,关于这两个部分下次再做介绍。

Fig1.1  Rendering pipeline

其中,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,从而提高性能,降低功耗。



作者:backward
链接:https://www.jianshu.com/p/ef73be4e5c0b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPU Instancer 是一款开箱即用的工具,可显示屏幕上对象的精确数量,性能表现强劲。只需鼠标点击几下,你就可以实例化你的预设、Unity 地形细节和树木。 GPU Instancer 可提供方便操作的工具,让你省去费力学习计算着色器和 GPU 基础架构的麻烦,轻松使用间接 GPU 实例化。同时,我们还提供带有详细文档的 API,用来管理运行时期更改。 --------------------------------- 功能特色 --------------------------------- - 适用于复杂 GPU 实例化的开箱即用型解决方案。 - 兼容 VR。适用于单通道和多通道渲染模式。 - 兼容移动端。适用于 iOS 和 Android。 - 易于使用的界面。 - 数以万计的对象仅需绘制调用一次,即可快速渲染。 - GPU 视锥体剔除。 - GPU 遮挡剔除(还支持具有单通道和多通道渲染模式的 VR 平台)。 - 支持自动配置的自定义着色器。 - 支持标准、通用和高清渲染管线。 - 一键即可将层次复杂的预制件进行实例化。 - 支持多个子网格。 - 支持 LOD 组和交叉渐变。(交叉渐变仅在标准渲染管线中支持) - 自动 2D 广告牌生成系统(仅限标准 RP)。 - 阴影投射和获得实例的支持(视锥剔除实例仍然可以投射阴影)。 - 能够按原型使用自定义阴影距离,以及选择用于渲染阴影的 LOD。 - 支持浮动原点处理。 - 支持多个视角。 - 记录良好的 API,可用于过程场景和运行时修改(包括示例)。 - 能够在运行时移除边界或碰撞体内的实例。 - 能够使用自定义计算着色器进行扩展。 - 展示 GPU 实例化器功能的示例场景。 预制件实例化功能: - 能够用你喜欢的预制件涂装工具在分配的场景中自动实例化预制件。 - 自动添加-移除预制件实例,无需任何附加代码。 - 自动检测和更新变换位置、旋转和缩放变化。 - 支持全部或区域定位的刚体和物理。 - 支持嵌套式预制件(Unity 2018.3 及更高版本)。 - 带有或不带实例化游戏对象的添加-移除-更新预制件实例(包括示例)。 - 经由 API 基于实例的材质变化(由于缓冲区限制,Android 不支持) - 在运行时基于实例启用和禁用实例化。 - 在运行时管理实例化预制件的 API。 - 包括带有自定义控制器的移动演示场景。 详细的实例化功能: - 高帧频的茂密草地和植被。 - 包括具有风、阴影、AO、广告牌和各种其他属性的植被着色器。 - 支持自定义着色器和材质。 - 支持交叉边形:自动将草纹理转变成交叉边形。 - 能够使用 Unity 地形上的自定义材质对预制件进行涂刷(使用 Unity 地形工具)。 - 能够在 Unity 地形上将预制件与 LOD 组一起使用。 - 通过自动空间分区进一步提高性能。 - 在运行时管理实例化地形详细信息原型的 API(包括示例)。 - 编辑器 GPU 实例化模拟。 树木实例化功能: - 高帧率的茂密森林。 - SpeedTree 支持风动画。 - SpeedTree 8 支持风动画。 - 树木创建器支持风动画。 - 支持软遮挡树。 - 包括广告牌烘焙师和渲染器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值