Unity3D URP 内置CSM分帧详解

news2024/9/21 11:05:12

技术详解

Unity3D的Universal Render Pipeline (URP) 提供了强大的渲染功能,其中内置的Cascaded Shadow Maps (CSM) 是一种用于大场景阴影渲染的高效技术。CSM通过将视锥体从近到远划分为多个层级,并为每个层级生成一张相同分辨率的深度图(ShadowMap),从而在不同区域下得到精度不同的阴影。然而,随着层级的增加,绘制ShadowMap的性能开销也会显著增加。为了优化这一性能问题,URP支持CSM的分帧优化技术。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

分帧优化思路

分帧优化技术的基本思路是,对于远处的ShadowMap,不必每帧都进行更新,而是可以每N帧才绘制一次。这样可以显著减少GPU的负载,提高渲染效率。具体实现时,可以根据层级的远近设置不同的更新频率,例如第0级(最近)每帧都更新,第1级隔1帧更新,第2级隔3帧更新,第3级隔7帧更新等。

主要步骤

  1. 设置Shadow Cascades:在Unity的Quality Settings中设置Shadow Cascades的数量,并调整每个层级的距离范围。
  2. 修改ShadowMap的更新频率:通过修改URP的ShadowCasterPass或相关脚本,控制每个层级ShadowMap的更新频率。
  3. 使用掩码和按位与运算:通过掩码和按位与运算判断当前帧是否需要更新某个层级的ShadowMap。
  4. 优化Clear操作:避免每帧都Clear整张RT(Render Target),而是针对每个层级的ShadowMap进行Clear操作。
  5. 处理UI相机和Overdraw问题:确保UI相机不会在每帧Clear掉整张RT,同时处理可能因分帧优化导致的Overdraw问题。

代码实现

以下是一个简化的代码示例,展示了如何在Unity URP中修改ShadowCasterPass以支持CSM的分帧优化。

// 假设有一个ShadowCasterPass的派生类,用于控制ShadowMap的绘制
public class CustomShadowCasterPass : ShadowCasterPass
{
// 层级更新频率的掩码
private int[] cascadeUpdateMasks = new int[] { 0xFFFFFFFF, 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0 };
// 当前帧的计数器
private int frameCounter = 0;
protected override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
// 检查是否需要更新当前层级的ShadowMap
bool shouldUpdate = (cascadeUpdateMasks[currentCascadeIndex] & (1 << (frameCounter % 32))) != 0;
if (shouldUpdate)
{
// 执行ShadowMap的绘制
base.Execute(context, ref renderingData);
// 清除当前层级的ShadowMap(如果需要)
// 注意:这里需要根据实际情况调整Clear操作
// ShadowUtils.RenderShadowSlice(context, ...);
}
// 更新帧计数器
frameCounter++;
}
// 其他必要的函数和方法...
}

注意

  • 上述代码仅为示例,实际实现时需要根据URP的具体版本和API进行调整。
  • cascadeUpdateMasks 数组中的每个元素代表一个层级的更新掩码,通过按位与运算判断是否需要更新。
  • frameCounter 用于记录当前帧的编号,通过模运算与掩码进行匹配。
  • 清除ShadowMap的操作(如ShadowUtils.RenderShadowSlice)需要根据实际情况进行调用,确保不会在每帧都执行。

总结

Unity3D URP内置的CSM分帧优化技术是一种有效的性能提升手段,通过减少远处ShadowMap的更新频率,可以显著降低GPU的负载,提高渲染效率。在实际应用中,需要根据项目的具体需求和性能瓶颈,灵活调整层级的数量和更新频率,以达到最佳的渲染效果。

更多教学视频

Unity3D​www.bycwedu.com/promotion_channels/2146264125

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

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

相关文章

【华为杯】2024数学建模研赛题目

2024数学建模研赛题目已经发布 各个赛题题目如下&#xff1a; A题 B题 C题 D题 E题 F题 赛题完整版在文末&#xff0c;点击下方名片。

【操作系统】01.冯·诺伊曼体系结构

上面这张图就是我们经常能在各种教材中看到的冯诺伊曼体系结构。我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 一、认识设备 输入设备&#xff1a; 键盘、鼠标、网卡、磁盘、摄像头…… 输出设备&a…

Java8 中一个极其强悍的新接口,很多人没用过

在开发过程中经常会使用​​if...else...​​​进行判断抛出异常、分支处理等操作。这些​​if...else...​​​充斥在代码中严重影响了代码代码的美观&#xff0c;这时我们可以利用Java 8的Function接口来消灭​​if...else...​​。 if (...){throw new RuntimeException(&qu…

深入Android UI开发:从自定义View到高级布局技巧的全面学习资料

在Android开发的世界中&#xff0c;UI设计和实现是吸引用户的关键。本文将为您介绍一套全面的Android UI开发学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;旨在帮助您从自定义View到高级布局技巧&#xff0c;全面提升您的UI开发技能。…

深度学习-从零基础快速入门到项目实践,这本书上市了!!!

此书地址&#xff1a; 《【2024新书】深度学习 从零基础快速入门到项目实践 文青山 跟我一起学人工智能 机器学习算法原理代码实现教程 深度学习项目分析 深度学习 从零基础快速入门到项目实践》【摘要 书评 试读】- 京东图书 除深度学习外我还写了一本软件测试书。我大概是国…

Godot游戏如何提升触感体验

在游戏世界中&#xff0c;触感体验至关重要&#xff0c;既能极大提升玩家沉浸感&#xff0c;让其深度融入游戏&#xff0c;在操作角色或与环境互动时&#xff0c;通过触感反馈获得身临其境的真实感&#xff08;比如动作游戏中角色攻击或受击时的振动反馈&#xff0c;能使玩家更…

【OSS安全最佳实践】降低因账号密码泄露带来的未授权访问风险

如果因个人或者企业账号密码泄露引发了未经授权的访问&#xff0c;可能会出现非法用户对OSS资源进行违法操作&#xff0c;或者合法用户以未授权的方式对OSS资源进行各类操作&#xff0c;这将给数据安全带来极大的威胁。为此&#xff0c;OSS提供了在实施数据安全保护时需要考虑的…

6. Python 输出长方形,直角三角形,等腰三角形

使用Python输出长方形&#xff0c;直角三角形&#xff0c;等腰三角形 这里主要使用python语言里的循环知识&#xff0c;具体说是Python语言里的循环嵌套&#xff0c; 注意&#xff0c;在实际使用中&#xff0c;循环嵌套一般最多到达3层&#xff0c;嵌套太多会影响到程序执行。…

JavaWeb - 5 - 前端工程化

一.前后端分离开发 前后端混合开发 缺点&#xff1a;沟通成本高&#xff0c;分工不明确&#xff0c;不便管理&#xff0c;不便维护拓展 前后端分离开发 当前最为主流的开发模式&#xff1a;前后端分离 前后端分离开发中很重要的是API接口文档&#xff08;如&#xff1a;YApi&…

蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性

知识点&#xff1a; 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注&#xff1a;传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址&#xff1a;http…

C++函数重载完成日期类相关计算

本文内容如下&#xff1a; 1.创建类以及函数的声明2.日期加减天数1.月份天数2.函数实现 3.日期比较大小4.日期减日期1.日期的前置和后置加加2.日期减日期的实现 5.内置类型的cout和cin本文代码如下&#xff1a; 要完成日期类的相关计算要创建自定义的类型&#xff0c;然后用函数…

Java制作拼图小游戏——基础编程实战(详细代码注释与流程讲解)

目录 前言 涉及知识点 准备工具 Java开发环境 图片资源 最终效果 ——需求分析 登录界面 功能描述 需求分析 功能需求 游戏主界面 功能描述 需求分析 功能需求 游戏菜单 游戏胜利界面 框架搭建 总结 编码 编码顺序 搭建App实现程序的入口 完成User用户类和…

计算总体方差statistics.pvariance()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 计算总体方差 statistics.pvariance() [太阳]选择题 根据给定的Python代码&#xff0c;运行结果为&#xff1f; import statistics data [1, 2, 3, 4, 5] print(f"【显示】data{…

【C++掌中宝】深入解析C++命名空间:有效管理代码的利器

文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&am…

2.Seata 1.5.2 集成Springcloud-alibaba

一.Seata-server搭建已完成前提下 详见 Seata-server搭建 二.Springcloud 项目集成Seata 项目整体测试业务逻辑是创建订单后&#xff08;为了演示分布式事务&#xff0c;不做前置库存校验&#xff09;&#xff0c;再去扣减库存。库存不够的时候&#xff0c;创建的订单信息数…

攻防世界Web新手练习区题目(view_source到simple_php)WP

目录 view_source​ robots​ Training-WWW-Robots PHP2​ get_post​ backup​ cookie​ disabled_button​ simple_js​ xff_referer​ weak_auth​ command_execution​ simple_php​ view_source 获取在线场景后访问题目场景 在右键不管用的情况下&#xff0…

尚品汇-秒杀成功下单接口、秒杀结束定时任务-清空缓存数据(五十四)

目录&#xff1a; &#xff08;1&#xff09;下单页面 &#xff08;2&#xff09;service-activity-client添加接口 &#xff08;3&#xff09;web-all 编写去下单控制器 &#xff08;4&#xff09;service-order模块提供秒杀下单接口 &#xff08;5&#xff09;service-or…

1份可以派上用场丢失数据恢复的应用程序列表

无论如何&#xff0c;丢失您的宝贵数据是可怕的。您的 Android 或 iOS 设备可能由于事故、硬件损坏、存储卡问题等而丢失了数据。这就是为什么我们编制了一份可以派上用场以恢复丢失数据的应用程序列表。 如果您四处走动&#xff0c;您大多会随身携带手机或其他移动设备。这些…

豆包Python SDK接入流程

模型与价格 豆包的模型介绍可以看豆包大模型介绍&#xff0c;模型价格可以看豆包定价文档里的“模型推理” - “大语言模型” - “字节跳动”部分。 推荐使用以下模型&#xff1a; Doubao-lite-32k&#xff1a;每百万 token 的输入价格为 0.3 元&#xff0c;输出价格为 0.6 元…

vue组件($refs对象,动态组件,插槽,自定义指令)

一、ref 1.ref引用 每个vue组件实例上&#xff0c;都包含一个$refs对象&#xff0c;里面存储着对应dom元素或组件的引用。默认情况下&#xff0c;组件的$refs指向一个空对象。 2.使用ref获取dom元素的引用 <template><h3 ref"myh3">ref组件</h3&g…