Unity 分块延迟渲染01 (TBDR)

2023-11-20

现代移动端图形体系结构的概述

现代SoC通常会同时集成CPU和GPU。

CPU被用于处理需要低内存延迟的序列、大量分支的数据集,其晶体管用于流控制和数据缓存。

GPU为处理大型,未分支的数据集,如3D渲染。晶体管专用于寄存器和算术逻辑单元,而不是数据缓存和流控制。

GPU的统一着色器架构和非统一着色器结构

在早期的GPU,顶点着色器和像素着色器的硬件结构是独立的,它们各有各的寄存器、运算单元等部件。然而独立的VS与PS势必会造成相对的不平衡,例如一个模型在较远位置时对VS的需求较多而PS的需求较少,在近处时相反,不平衡就势必会造成性能的冗余,为了解决VS和PS之间的不平衡,引入了统一着色器架构(Unified shader Architecture)。此架构的GPU的VS和PS用的都是相同的Core。也就是,同一个Core既可以是VS又可以是PS。,下图展示了与非统一架构相比,统一着色器架构在性能和能耗商的优势

GPU的Immediate架构

桌面GPU的架构一般被称为是Immediate架构。Immediate架构将渲染处理为一个严格的指令流,在每个Draw Call中对每一个图元按顺序执行顶点与片段着色器。,每个对象一经提交就会立即穿过整个管线,在处理下一个对象之前进行转换、光栅化和着色。这种架构的弊端是很明显的,先进行绘制的对象可能被后边的对象覆盖,导致”Overdraw“的发生,为了避免这种现象,现代的immediate架构都会使用Early-Z技术对场景内的对象进行排序来减少Overdraw的发生。

忽略并行处理和管线,下列伪代码为这种架构的high-level示例:

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)

下图为IMR pipline的流程图:

下图展示了GPU数据流与内存的交互

Immediate架构的优点

顶点着色器和其他几何相关的着色器的输出可以存在如上图所示的FIFO缓存区中,直到管线的下一个阶段(PS)准备好使用这些数据。我们可以看到在VS->PS的过程中GPU使用内存带宽的时候很少,这也是该架构的优点。

Immediate架构的缺点

正如上文所言,Immediate架构在VS->PS的过程中对内存带宽的使用很少,但是在PS->Framebuffer的过程中却反之。流中的每一个三角形都有可能覆盖屏幕的任何一个部分,这也就意味着Framebuffer Working Set(帧缓冲区工作集)必须是整个framebuffer的大小。例如一个1440p的设备,使用32位来表示颜色,32位来表示深度/模板缓冲区,那么FWS的大小极为30MB,这么大的FWS当然无法保存在on-chip上,那么只能存储在内存中,那么每一次进行深度/模板测试的时候GPU就必须对内存进行一次读写操作,由于每个片段有多个读-修改-写操作,因此在这个阶段内存带宽的负载是非常高的。

GPU的Tile-Based架构

所谓Tile,就是将几何数据转换成小矩形区域的过程。光栅化和片段处理在每Tile的过程中进行。Tile-Based Rendering的目的是在最大限度地减少fragment shading期间GPU 需要的外部内存访问量,从而来节省内存带宽。TBR将屏幕分成小块,并在将每个小图块写入内存之前对每个小图块进行片段着色。为了实现这一点,GPU 必须预先知道哪些几何体属于这个tile.因此,TBR将每个渲染通道拆分为两个处理通道:

  • 第一遍执行所有与几何相关的处理,并生成该tile专属的Primitive list,指示哪些图元在tile内。
  • 第二遍逐tile进行光栅化并且进行Fragment shading,并在完成后将其写回内存。

以下为TBR的伪代码:

python

# Pass one

for draw in renderPass:

    for primitive in draw:

        for vertex in primitive:

            execute_vertex_shader(vertex)

        if primitive not culled:

            append_tile_list(primitive)

​

# Pass two

for tile in renderPass:

    for primitive in tile:

        for fragment in primitive:

            execute_fragment_shader(fragment)

下图展示了TBR的基本流程

下图显示了TBR的硬件数据流和与内存的交互:

TBR的优势

1.节省带宽

TBR的主要优点是tile仅占Framebuffer的一小部分。因此,可以将tile的颜色、深度和模板的整个work set存储到与 GPU shader核心紧密耦合的On-chip中。因此,GPU 进行深度测试和混合透明片段所需的Framebuffer数据无就不必要从内存中重复多次进行读写了,从而提升性能,节省能耗。

此外,部分深度/模板缓冲区,只需要在着色过程中存在,无需写回内存,TBR可以选择Discard掉这部分内容来进一步减少带宽使用(调用 OpenGL ES 2.0 中的glDiscardFramebufferEXT、OpenGL ES 3.0 中的 glInvalidateFramebuffer或使用 Vulkan 中的render pass的 storeOp 来进行具体设置)

2.方便了部分算法的实现

TBR启用了一些算法,否则这些算法的计算成本太高或带宽使用过高。

tile足够小,于是可以在内存中本地存储足够多的sample,以实现MSAA。因此,硬件可以在tile写回内存期间将多个样本resolve,而无需单独的resolve pass。

传统的Defer-Rendering将使用多渲染目标 (MRT) 渲染来实现延迟照明,将每个像素的多个中间值写回主内存,然后在第二遍中重新读取它们。而在TBR中片段着色器以编程方式访问由先前片段存储在帧缓冲区中的值可以对Defer-Rendering进行优化。

TBR的问题与PowerVR的TBDR

虽然TBR改进了IMR的设计,但是本质上其并没有解决OverDraw。渲染每个tile时,将按提交顺序处理几何图形。会被遮挡的片元依旧将被处理,从而导致冗余的颜色计算和纹理数据提取。Early-Z技术可以用来减少overdraw,但是与IMR一样,应用程序必须进行排序。

PowerVR在光栅化之后增加了一步叫做HSR(Hidden Surface Removal 隐藏表面消除)的步骤,其大致原理如下:

当一个像素通过了Early-Z准备执行PS进行绘制前,先不画,只记录标记这个像素归哪个图元来画。等到这个Tile上所有的图元都处理完了,最后再真正的开始绘制每个图元中被标记上能绘制的像素点。

由于所有操作都是在片上进行的,所以代价极小,最终实现零Overdraw。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity 分块延迟渲染01 (TBDR) 的相关文章

  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • GooglePlay提审警告(com.google.android.gms:play-services-safetynet:17.0.0)

    1 Goole在今年6月份出的新政策 不在使用safetynet 而使用Play Integrity API 2 项目本身没有使用过safetynet 3 使用了firebase 查阅资料 解决方案如下 implementation pla
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity中URP下的指数雾

    文章目录 前言 一 指数雾 雾效因子 1 FOG EXP 2 FOG EXP2 二 MixFog 1 ComputeFogIntensity 雾效强度计算 2 lerp fogColor fragColor fogIntensity 雾效颜
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常用实践操作之按动任意键触发

    接下来一些笔记会对于一些大大小小的实践操作进行记录 希望对你有所帮助 在游戏中 我们经常会遇到一些按动任意键触发的操作 接下来展示核心代码 以下是对于Unity中的操作 使用的UI是NGUI 对于核心操作没有影响 你可以自己置换 void
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • uview的select组件选择问题

    官方文档羞涩难懂 直接用拖拽工具 对于常用的表单组件 可直接帮你生成相关事件 时间 单列多列等选择器等支持数据回显功能 免开发 在拖拽面板中的 formitem 表单项中 转载 uniapp页面速成提效工具 uniapp uview ui
  • Xray工具使用(一)

    xray简介 xray 是一款功能强大的安全评估工具 主要特性有 检测速度快 发包速度快 漏洞检测算法高效 支持范围广 大至 OWASP Top 10 通用漏洞检测 小至各种 CMS 框架 POC 均可以支持 代码质量高 编写代码的人员素质
  • 华为java社招面试题目及全部流程详解

    华为的招聘流程一直非常复杂 本人最近参加了华为的社招 对全部流程有一个总体了解 包括流程 面试题目类型 分享给大家 希望大家能有所帮助 首先是华为hr审核简历 看一个简历和所需职位的匹配度 基本就是看毕业学校 看掌握技能是否与所需职位吻合
  • 《论文阅读》CARE:通过条件图生成的共情回复因果关系推理 EMNLP 2022

    论文阅读 CARE 通过条件图生成的移情反应因果关系推理 前言 简介 基础知识 Transformer Variational Graph Auto Encoder 变分图自编码器 邻接矩阵 adjacency matrix 图神经网络 G
  • HDFS 文件读写流程剖析

    Write hadoop fs put czz log wc in 1 Client调用FileSystem create filePath 方法 与NN进行RPC通信 check是否存在及是否有权限创建 假如不ok 就返回错误信息 假如o
  • 【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

    pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件 相关接口如下所示 函数 描述 rt device find 根据 PWM 设备名称查找设备获取设备
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • 算法篇--链表求和

    问题描述 给两个链表 每个链表为一个整数的倒序 如下 1 2 3 4 5 7 9 两个数字的结果 321 9754 10075 那么 请得到 链表的结果为 5 7 0 0 1 思考 思路总结 两个链表肯定有一个最长的 等于情况取哪个都行 所
  • sudo配置文件/etc/sudoers详解及实战用法

    一 sudo执行命令的流程 将当前用户切换到超级用户下 或切换到指定的用户下 然后以超级用户或其指定切换到的用户身份执行命令 执行完成后 直接退回到当前用户 具体工作过程如下 当用户执行sudo时 系统会主动寻找 etc sudoers文件
  • hudi概念

    近实时摄取 对于 RDBMS 关系型的摄入 Hudi提供了更快的 Upset 操作 例如 你可以通过 MySql binlog 的形式或者 Sqoop 导入到 hdfs上的对应的 Hudi表中 这样操作比 Sqoop 批量合并 job Sq
  • tomcat进程意外退出的问题分析

    节前某个部门的测试环境反馈tomcat会意外退出 我们到实际环境排查后发现不是jvm crash 日志里有进程销毁的记录 从pause到destory的整个过程 org apache coyote AbstractProtocol paus
  • RNA-seq——四、根据序列比对结果筛选差异基因

    目录 1 合并矩阵并进行注释 2 筛选差异基因 DESeq2 写在前面 经过前面的一系列分析 我们得到了几个counts数据 接下来就需要根据这些数据来进行分析 本文使用Rstudio 从序列比对结果中筛选出差异基因 目的是 根据不同基因的
  • 在使用服务器时,配置torch环境(这里是以tengxunyun为例子配置的环境)

    这里配置的环境是使用的bubbliiiing的代码为例子进行配置的 配置环境需要对应自己电脑的显卡以及CUDA版本 最重要是torch的安装 一定要去官网去找对应的版本 1 conda create n pytorch python 3 6
  • 【Vue3.0实战逐步深入系列】使用elementui组件库element-plus美化投票功能

    千字长文 熬夜更新 原创不易 多多支持 感谢大家 前言 小伙伴们大家好 前面一篇文章中我们利用vue3 0实现了一个超级简单的投票功能 虽然功能是实现了也达到了巩固vue3 0知识点的目的 但是页面没有添加任何样式也没有进行任何的UI设计
  • 软件工程基础知识--系统测试

    系统测试与调试 1 系统测试的意义和目的 系统测试是为了发现错误而执行程序的过程 以最少的人力和时间发现潜在的各种错误和缺陷 根据测试的概念和目的 在进行信息系统测试时应遵循以下基本原则 1 应尽早并不断地进行测试 2 测试工作应该避免由原
  • python入门之字符串

    目录 一 字符串的定义 二 字符串的常用操作 三 字符串的切片 一 字符串的定义 字符串就是一串字符 是编程语言中表示文本的数据类型 在python中可以使用一对双引号 或者一对单引号 定义一个字符串 虽然可以使用 或者 做字符串的转义 但
  • 区块链数字存证平台有哪些功能模块

    区块链数字存证平台通常包括以下功能模块 数字存证 将数字文件的哈希值存储到区块链上 确保文件的完整性和不可篡改性 时间戳 记录数字文件的创建时间和存证时间 确保存证的时效性和证据的可信度 鉴定证书 提供数字文件的鉴定证书 证明文件的真实性和
  • 第7章 Linux文件过滤及内容编辑处理

    第7章 Linux文件过滤及内容编辑处理 在第5章 我们讲解了Linux系统文件及目录处理的基本命令知识和应用实践 本章继续为大家讲解处理Linux系统文件内容的一些核心命令 这些命令同样十分重要 7 1 vi vim 纯文本编辑器 Win
  • Fedora又一次哑了,又如何?

    Fedora自从34版本开始使用PipeWire代替原来的PulseAudio 每次更新系统版本就让用户产生怀疑的态度 此前我就写过一篇 Fedora 34成哑巴了 结果在Fedora35又失效了 原因是Fedora35选择WirePlum
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不