Unity 分块延迟渲染01 (TBDR)

news2024/9/23 13:21:26

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

现代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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django_内置的用户认证系统

目录 一、用户对象 1. 创建用户 2. 修改密码 3. 用户验证 二、权限与授权 1. 默认权限 2. 用户组 3. 在代码中创建权限 4. 权限缓存 三、在视图中认证用户 1、登录用户 2、注销用户 3、用户登录的访问限制 3.1、原始的办法 3.2、函数视图使用login_required装饰…

【前端】网页开发精讲与实战 CSS Day 1

🚀Write In Front🚀 📝个人主页:令夏二十三 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:前端 💬总结:希望你看完之后,能对你有…

Go 并发模型—Goroutine

前言 Goroutines 是 Go[1] 语言主要的并发原语。它看起来非常像线程,但是相比于线程它的创建和管理成本很低。Go 在运行时将 goroutine 有效地调度到真实的线程上,以避免浪费资源,因此您可以轻松地创建大量的 goroutine(例如每个请…

快速排序—C语言实现

目录 前言 快速排序 实现逻辑 1. hoare版本​编辑 2. 挖坑法 3. 前后指针版本 快速排序优化 1. 三数取中法选key 2. 递归到小的子区间时,可以考虑使用插入排序 快速排序非递归(用栈实现) 快速排序的特性总结 全部代码 前言 &#…

idea-spring boot开发

安装maven与配置配置maven安装插件 已经装好了idea与jdk 安装maven与配置 下载地址: https://maven.apache.org/download.cgi 下载合适的版本 配置maven 打开设置: 直接搜索 :maven 配置变量: 此电脑->属性->高级系统设置->环境变量 新建系统变量 MAVEN_HOME&#xff…

Web安全——渗透测试基础知识下

渗透测试基础 Web安全一、VMware虚拟机学习使用1、虚拟机简单介绍2、网络模式2.1 桥接网络(Bridged Networking)2.2 NAT模式2.3 Host-Only模式 3、通俗理解 二、Kali的2021安装与配置1、简单介绍2、Kali的版本3、配置3.1 安装虚拟机open-vm-tools-deskto…

基于matlab从ROI和蒙版在图像中创建标记(附源码)

一、前言 此示例演示如何从一组 ROI 创建标记的阻止映像。 在此示例中,您使用两种方法来获取和显示标记的数据。一种方法使用多边形ROI对象来存储肿瘤和正常组织区域边界的坐标。该函数将ROI坐标转换为标记的块图像。第二种方法使用掩码来指示图像的二进制分割为组…

能不能推荐个 vue 后台管理系统模板?

前言 下面是我整理的vue2和vue3的一些后台管理系统模板,希望对你有帮助~ Vue2 1、iview-admin Star: 16.4k 基于 iview组件库开发的一款后台管理系统框架,提供了一系列的强大组件和基础模板,方便开发人员快速搭建一套功能丰富、界面美观、…

web入门案例-部门篇

开发流程 完成对应部门管理和员工管理的需求 准备工作 注意:service还要写接口实体类,mapper只写接口即可,controller是实体类 对应的三个注解 RestController(方法返回值作为响应值) Mapper(控制反转IOC&#xff0c…

漏洞深度分析 | CVE-2023-36053-Django 表达式拒绝服务

​ 项目介绍 Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、务实的设计。它由经验丰富的开发人员构建,解决了 Web 开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。它是免费且开源的。 项目地址…

CodeTop整理-树篇

目录 103. 二叉树的锯齿形层次遍历 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和 102. 二叉树的层序遍历 94. 二叉树的中序遍历 110. 平衡二叉树 572. 另一个树的子树 96. 不同的二叉搜索树 543. 二叉树的直径 297. 二叉树的序列化与反序列化 199. 二叉树的…

eNSP-VRRP虚拟路由器冗余技术

VRRP-虚拟路由器冗余技术 文章目录 VRRP-虚拟路由器冗余技术一、拓扑结构二、基本配置三、测试验证四、知识点详解1.VRRP路由器2.报文格式3.工作过程 一、拓扑结构 二、基本配置 R1: #配置ip <Huawei>sys [Huawei]sys r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip a…

快速排序算法!

快速排序 什么是快速排序&#xff08;quickSort&#xff09;&#xff1f; 主要分成两部分实现&#xff0c;分区、递归操作。 分区 从数组中任意选择一个 “基准”&#xff0c;所有比基准小的元素放在基准前面&#xff0c;比基准大的元素放在基本后面。 递归 递归地对基准…

Todo-List案例版本四

全局事件总线 使用步骤 1.定义全局事件总线 new Vue({...beforeCreated(){Vue.prototype.$busthis //安装全局事件总线&#xff0c;$bus就是当前应用的vm}... }) 2.使用事件总线 a.接收数据&#xff1a;A组件想接收数据&#xff0c;则在A组件中给$bus绑定自定义事件&…

Outlook---撤回(或替换)已发出的邮件

0 Preface/Foreword 发送邮件时&#xff0c;发现邮件发错了&#xff0c;或者忘了添加附件&#xff0c;那么就需要用到撤回或者替换功能。 1 撤回/替换邮件方法 步骤如下&#xff1a; 第一步&#xff1a;双击打开邮件&#xff1b; 第二步&#xff1a;找到撤回按键

自锁电路分析与应用

原理图分享 今天工作中遇到一个设计很妙的电路&#xff0c;请教了一下硬件的工程师。 大家自己直接看图可以分享出这个电路的作用吗&#xff0c;可以在评论区告诉我哦&#xff01; 自锁电路 如上图就是一个自锁电路&#xff0c;和下面的电路一样&#xff1a; 电路现象描述&a…

23.RTC实时时钟

1.STM32 RTC介绍&#xff1a; &#xff08;1&#xff09;RTC简介&#xff1a; STM32的实时时钟(RTC)是一个独立的定时器。STM32的RTC模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和…

虚幻5-could not find root physics body 布料系统问题解决方法

不做不知道自己身体好&#xff0c;又碰到问题了&#xff1a; could not find root physics body 1.据说是Skeleton 和SkeletaMesh傻傻分不清楚 &#xff08;但就是排查后&#xff0c;就不是这个问题&#xff09; 2.重新创造一个Physic Asset吧 Creating a New Physics Asse…

【C语言初阶(13)】三子棋游戏(优化:多子棋实现)

文章目录 一、游戏的实现思路二、游戏的实现步骤1. 菜单函数2. 设置棋盘3. 初始化棋盘4. 打印棋盘5. 玩家下棋6. 电脑下棋7. 多子棋判断输赢8. 判断棋盘是否已满 三、模块化代码实现1. test.c2. game.h3. game.c 四、结果演示 由于模块化编程的需要&#xff0c;我们需要把整个游…

解决Bridge材质导入到Blender为白色的问题

文章目录 前言一、复现问题二、解决方案总结 前言 一、复现问题 在Bridge上看到一块不错的草皮, 导入成功后是白色材质: 二、解决方案 以前用这个方法导入过模型, 那时候还没启用汉化, 也没什么材质问题. 这次操作之前刚启用了汉化, 我猜是汉化导致: 取消勾选’新建数据’, 重…