URP源码学习(七)一些细节和理解

2023-10-27

RT理解

RT是什么,用在哪

  • 首先rt是一张特殊贴图,这张贴图对应的是GPU上的FrameBuffer,一般用到的是颜色和深度,从这张图取数据用于计算,或是直接对这张图进行修改,以得到想要的效果。
    • FrameBuffer就是gpu里渲染结果的目的地,我们绘制的所有结果(包括color depth stencil等)都最终存在这个这里。现代GPU通常都有几个FBO,实现双缓冲,以及将渲染结果保存在GPU的一块存储区域,之后使用。
  • RT的应用主要是几个方式,一是从rt取数据,比如取深度用于各种计算。二是取这张图,比如在UI上显示模型,或是截图保存等。再一个就是是对图进行处理,实现扭曲或是其他全屏效果。
  • 一般来说,不使用rt也是可以渲染出想要的图的,但是drawcall就会很多,unity内置管线,获取深度就是渲染一遍物体,这必然比直接取buffer消耗要大很多。但是从GPU拷贝数据回CPU,需要硬件支持,unity提供了CopyTextureSupport接口判断支持的拷贝方法,按硬件的发展速度应该不支持的会越来越少的。

unity接口

  • unity对rt的抽象是RenderTexture这个类,定义了一些属性,包括大小,精度等各种。
  • RenderTargetIdentifier
    • unity CoreModule实现,定义CommandBuffer用到的RenderTexture
    • 封装了texture的创建,因为texture创建方式有几种,rt,texture,BuiltinRenderTextureType,GetTemporaryRT
    • 这个类只是定义了rt的各种属性,真正创建应该是在CommandBuffer内部
    • BuiltinRenderTextureType类型:cameratarget、depth、gbuffer等多种
    • CommandBuffer.SetRenderTarget,可分别设置color和depth,以及贴图处理方式
    • CommandBuffer.SetGlobalTexture,效果是把texture赋值给shader变量,shader采样这个texture
  • RenderTextureDescriptor
    • 封装创建rt需要的所有信息,可复用,修改部分值,减少创建消耗
  • RenderTargetHandle
    • URP对RenderTargetIdentifier的一个封装
    • 保存shader变量的id,提升性能,避免多次hash计算
    • 真正用rt的时候,才会创建RenderTargetIdentifier
    • 定义了一个静态CameraTarget

URP用法

  • URP不会直接用到rt,而是通过CommandBuffer的接口设置,参数是RenderTargetIdentifier。
  • CoreUtils封装了SetRenderTarget方法,ScriptableRenderer调用
  • ScriptableRenderPass,封装ConfigureTarget方法,可以设置color和depth
  • pass设置好color和depth的rt后,renderer执行ExecuteRenderPass函数时读取,并设置给cb
  • pass内部会根据需要设置color和depth的渲染内容,比如从buffer拷贝深度时,是渲染深度值到color缓冲区。
  • 总结下来是由pass决定要渲染到哪个rt,以及用什么方式。然后renderer调用CoreUtils设置,设置好后调用pass的Execute方法渲染。

RT应用

深度纹理获取

URP提供了两种获取深度图的方法,一种是像内置管线那样,直接渲染指定pass,另一种是取深度buffer,渲染到一张rt上,优先用取深度buffer的方法,效率更高,但是需要系统和硬件支持。

先看下什么情况会生成深度图

  1. 主动开启,在PipelineAsset选择DepthTexture。
  2. 渲染scene相机,固定开启,并用DepthOnly的方式获得。
  3. 对于game相机,后处理,SMAA抗锯齿,DOF,运动模糊,用到了一个就会自动开启。判断在UniversalRenderPipeline的CheckPostProcessForDepth方法。

取深度buffer,CopyDepthPass

  • CanCopyDepth函数判断当前环境是否可开启。现在看起来需要系统支持拷贝深度贴图并且不能开启MSAA,看注释之后的版本会支持MSAA。
  • 这个pass一般在不透明渲染之后执行。看代码对scene相机执行时间不同,可是现在scene不会用这个渲染,可能是给以后留的吧。
  • 实现方法
    • SetUp:设置源rt关联到shader的_CameraDepthAttachment。目标rt关联到_CameraDepthTexture。
    • Configure:设置目标rt格式,colorFormat为Depth,32位,msaa为1不开启,filterMode为Point
    • Execute,这地方理解的不知道对不对
      • 先将源rt的内容赋值到shader定义的_CameraDepthAttachment贴图中
      • 然后调用基类的Blit方法,先设置管线的color为depth,也就是将depth渲染到color buffer中,然后执行Blit指令,用CopyDepth shader将buffer渲染到指定贴图上,后续shader直接采样这张贴图。
      • vert函数,坐标转换,object-clip,实际是没用的,有用的操作是设置uv,用于采样buffer,实际uv应该就是对应分辨率的。
      • frag:定义了msaa的处理,现在不会用到。直接采样_CameraDepthAttachment输出颜色,按现在的写法,应该直接用_CameraDepthAttachment就行了。额外渲染一次,应该是为了msaa准备的。
      • 流程总结:先设置管线的color buffer为depth,将相机得到的深度渲染到_CameraDepthAttachment,再调用CopyDepth shader渲染到_CameraDepthTexture

DepthOnlyPass

  • 渲染所有shader中有DepthOnly pass的物体到指定深度buffer。
  • 相机的rt,设置为哪个texture,渲染的物体就都渲染到这个rt上。

RT应用-opaque纹理获取

这个在内置的管线,是通过shader的grab指令获取的,移动设备支持的不好,URP加了一个拷贝buffer的方式,性能会好一些。

通过CopyColor pass实现。相比深度纹理简单很多,不需要判断硬件是否支持。

ForwardRenderer对depth和opaque贴图处理流程

  • renderer类相当于pass和unity底层交互的一个接口,定义了各个opaque和depth的rt
  • 各个rt默认是相机目标,可用于获取color和depth的buffer
  • 如果需要渲染color或depth到贴图中,在添加pass之前要做一些操作,只有base相机才能渲染到color和depth
    • 判断createColorTexture和createDepthTexture,设置m_CameraColorAttachment和m_CameraDepthAttachment
    • 如果需要创建texture,执行CreateCameraRenderTarget函数,这个函数会调用GetTemporaryRT生成rt,函数执行后,color的depthBufferBits可能会设置为32位。
    • 设置好后,会传给基类的m_CameraColorTarget。每个pass执行Execute方法前,会先设置camera的rt。

对rt的理解大概就这些,URP做了一些封装,看起来有点绕,反正核心就是改变渲染数据写入的位置,由屏幕变成我们定义的一张图,然后取这张图用来实现各种效果。

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

URP源码学习(七)一些细节和理解 的相关文章

  • 对Unity3D 静态批处理和动态批处理的理解

    Draw Call就是CPU调用图像编程接口 像OpenGL或者 DirectX 简单来说 Draw Call就是由CPU发起的一个命令 添加到一个命令缓冲区 当GPU完成了上一次的渲染任务之后 会从命令缓冲区的命令队列中再取出一个并执行
  • unity的LOD组件

    本文转载自http blog csdn net huutu article details 52106468 LOD是Level Of Detais 的简称 多细节层次 在游戏场景中 根据摄像机与模型的距离 来决定显示哪一个模型 一般距离近
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Unity3d获得android和ios设备的唯一标识

    android为mac地址 ios为advertisingIdentifier 函数都比较简单 网上也搜得到 我也就不多说了 主要是对于我们没做过安卓和IOS开发的人来说 整合进工程有各种的问题 我也就直接上网盘了点击打开链接 代码包里看得
  • unity 性能查看工具Profiler

    文章目录 前言 profiler工具介绍 菜单栏 帧视图 模块视图 模块详细信息 通过profiler分析优化游戏性能 最后 前言 每次进行游戏优化的时候都用这个工具查看内存泄漏啊 代码优化啊之类的东西 真的好用 但是之前也就是自己摸索一下
  • Unity打包WebGL的优化常用操作?

    1 贴图部分优化 如果贴图格式时2048 在不影响画面效果的情况下 改成1024或者5 12 还可以缩小包体 2 压缩和解压缩问题 WebGL打包的时候分三种压缩情况 gzip 比Brotli文件打 但打包快 http和https都支持 B
  • java中Keytool的使用总结

    java中Keytool的使用总结 2011 02 26 15 30 15 分类 在申请Android Map API Key的时候使用到了java中Keytool 下面转一篇介绍java中Keytool的文章 http blog csdn
  • unity实现鼠标右键控制视角

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

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • unity3d image组件不显示

    需要将UI组件放到画布下面
  • mixamo根动画导入UE5问题:滑铲

    最近想做一个跑酷游戏 从mixamo下载滑铲动作后 出了很多动画的问题 花了两周时间 终于是把所有的问题基本上都解决了 常见问题 1 动画序列 人物不移动 2 动画序列 人物移动朝向错误 3 蒙太奇 人物移动后会被拉回 4 蒙太奇 动画移动
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

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

随机推荐

  • GIT GUI(git的可视化工具)

    目录 一 前言 二 Git和GitHub通过密钥绑定 三 把本地文件夹进行git初始化 四 通过Git Gui上传文件至GitHub 一 前言 GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象 因此推出了一个GIT
  • mc显示未发现java_mc命令编译一直报错, 提示找不到JavaInfo.jar

    x 我已经在 issues 里搜索 没有重复的issue 环境信息 arthas boot jar 或者 as sh 的版本 3 1 1 Arthas 版本 3 1 1 操作系统版本 Cent7 5 目标进程的JVM版本 JDK8 执行ar
  • Vue 和 React 的对比

    目录 前言 一 vue2 与 react 15 的对比 1 vue2 与 react 15 的相同点 2 vue2 与 react 15 的不同点 1 数据流的不同 2 框架本质不同 3 模板不同 4 组件通信方式不同 5 组合不同功能的方
  • 【c++实战项目】——云备份服务器

    项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上 并且随时可以通过浏览器进行查看并且下载 其中下载的过程支持断点续传 服务器上有热点管理模块 将非热点文件进行压缩存储 节省服务器的磁盘空间 服务器各个模块的功能介绍 配置文件管理模块
  • JAVA 日期工具类(全面,代码可以直接使用)

    这是一个比较全面的时间工具类 可供参考 import cn hutool core date DatePattern import cn hutool core date DateTime import cn hutool core uti
  • VTM新手踩坑

    VTM踩坑实录 1 编码后yuv文件打开异常 2 编码帧数偏少 3 VTM命令行参数 1 编码后yuv文件打开异常 利用ffmpeg播放改文件 命令行 ffplay video size 宽x高 i file name yuv 时出现该画面
  • 入行 AI 训练营限时报名!

    作为码农一枚 近来这一年左右时间里 连续发生了多件事情 使得笔者不得不抬起原本一直低着敲代码的头 看看这个为 AI 狂欢的世界 01 算法 工程和数据 我们不说怎么能够成为XXX 我们先来看看成为XXX之后要做什么事情 而做这些事情 需要什
  • 点击延迟_TWS耳机可以测试延迟啦!“Latency Test”软件详细操作流程

    配备耳机孔的手机越来越少 蓝牙耳机已经成为大势所趋 然而和传统的有线耳机相比 蓝牙耳机始终存在一些硬伤 例如电量 成本以及延迟 延迟这一点 其实一直被很多人所诟病 用蓝牙耳机看视频影音不同步啦 玩音游总是打不到拍子上啦 这些情况都得怪蓝牙耳
  • 移动端 视角移动冲突 解决Input.GetAxis()

    不用它 用 Input GetTouch i detalPosition x
  • 使用xmanager 远程操作linux

    随着互联网的高速发展以及Linux企业应用的成熟 Linux被广泛应用于服务器领域 如何实现Linux的远程管理成为网络管理员的首要任务 我们经常见到的几种最为常用的windows下远程管理Linux服务器的方法 基本上都是利用Secure
  • NPM使用技巧

    NPM使用技巧 前言 技巧 全局模块位置 PowerShell报错 安装模块冲突 NPM介绍 NPM命令 使用方法 基本命令 模块命令 查看模块 运行命令 镜像管理 常用模块 rimraf yarn 前言 本文包含NodeJS中NPM包管理
  • ADO.NET的五个主要对象

    文章目录 Connection Command DataAdapter DataSet DataReader ADO NET中的五个主要对象 Connection Command DataAdapter DataSet DataReader
  • vue+express+websocket+mongodb在线群聊工具

    vue express websocket mongodb在线群聊工具 目录 vue express websocket mongodb在线群聊工具 1 项目概述 2 项目运行 3 项目代码细节 3 1 后端 3 1 1 nodejs连接数
  • (五)逻辑架构

    逻辑架构 1 逻辑架构剖析 1 1 服务器处理客户端请求 1 2 Connectors 1 3 第1层 连接层 1 4 第2层 服务层 1 5 第3层 引擎层 1 6 存储层 1 7 小结 2 SQL执行流程 2 1 MySQL 中的 SQ
  • 我们应该如何使用webstorm呢

    WebStorm2020安装教程 软件名称 WebStorm2020 软件语言 简体中文 软件大小 269 28MB 安装环境 Win10 Win8 Win7 64位下载链接 百度网盘地址 提取码 damd WebStorm是一款JavaS
  • Unity核心6——Animation

    一 动画窗口 通过 Window gt Animation gt Animation 打开 Animation 窗口 Animation窗口主要用于在 Unity 内部创建和修改动画 所有在场景中的对象都可以通过 Animation 窗口为
  • Latex的一些操作

    ps 最近投个论文 需要Latex排版 于是简单使用一下 记录一些基本步骤 以防备用 一 下载与安装工具 texlive的下载与安装 参见这个网友写的 https blog csdn net weixin 39892850 article
  • DeepJavaLibrary(DJL)框架的使用:在java上使用AlphaPose完成实时多人姿态估计任务

    首先 这里是完整的项目代码 目录 实现环境 实现原理 DJL框架能帮我们做什么 Alphapose 实现步骤 一 导出alphapose模型 导出yolov5 导出单人姿态估计网络 二 实现Translator 使用YoloTranslat
  • Java类的加载机制

    一 类的生命周期 1 加载的生命周期 类从被加载到虚拟机内存中开始 到卸载出内存为止 它的整个生命周期包括 加载 Loading 验证 Verification 准备 Preparation 解析 Resolution 初始化 Intial
  • URP源码学习(七)一些细节和理解

    RT理解 RT是什么 用在哪 首先rt是一张特殊贴图 这张贴图对应的是GPU上的FrameBuffer 一般用到的是颜色和深度 从这张图取数据用于计算 或是直接对这张图进行修改 以得到想要的效果 FrameBuffer就是gpu里渲染结果的