Unity3D URP 内置CSM分帧详解

技术详解

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.xdnf.cn/news/145720.html

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

相关文章

【图像检索】基于灰度共生矩的纹理图像检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于灰度共生矩的纹理图像检索&#xff0c;用matlab实现。 一、案例背景和算法介绍 …

供应商管理系统,比价系统,在线询价系统一体化(代码)

前言&#xff1a; 随着互联网和数字技术的不断发展&#xff0c;企业采购管理逐渐走向数字化和智能化。数字化采购平台作为企业采购管理的新模式&#xff0c;能够提高采购效率、降低采购成本、优化供应商合作效率&#xff0c;已成为企业实现效益提升的关键手段。系统获取在文末…

50k star!Openpilot这个开源项目,赶紧给自己的车安排上自动驾驶了

你有没有想过,有一天你的车可能比你更懂得如何开车?如果你每天被城市的堵车和高强度驾驶折磨,那么这篇文章一定能给你带来一些惊喜。今天我们要聊的是一个让车子“自学成才”的系统——Openpilot。该项目是 GitHub 上一个开局不到一个月的项目,目前已经快 50K 的 star 了。…

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

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

Modular Elven Archer 幻想精灵女弓箭手游戏角色模型

可爱的精灵射手的3D模型。用额外的骨骼固定到人形。完全模块化,包括一个没有衣服的身体。包含苹果混合形状。 下载:​​Unity资源商店链接资源下载链接 效果图:

Java-数据结构-优先级队列(堆)-(二) (゚▽゚*)

文本目录&#xff1a; ❄️一、PriorityQueue的常用接口&#xff1a; ➷ 1、PriorityQueue的特性&#xff1a; ➷ 2、使用PriorityQueue的注意&#xff1a; ➷ 3、PriorityQueue的构造&#xff1a; ☞ 1、无参数的构造方法&#xff1a; ☞ 2、有参数的构造方法&#xff1a; …

Error when custom data is added to Azure OpenAI Service Deployment

题意&#xff1a;在向 Azure OpenAI 服务部署添加自定义数据时出现错误。 问题背景&#xff1a; I receive the following error when adding my custom data which is a .txt file (it doesnt matter whether I add it via Azure Cognitive Search, Azure Blob Storage, or F…

uniApp微信小程序扫描普通二维码跳转到小程序指定页面操作方法

这篇文章主要给大家介绍了关于微信小程序扫描普通二维码跳转到小程序指定页面操作的相关资料,需要的朋友可以参考下 1、首先我们需要在微信公众平台的开发管理——>开发设置&#xff0c;找到&#xff08;扫普通链接二维码打开小程序&#xff09;&#xff0c;点击添加,根据提…

C++ 9.20

练习&#xff1a;定义一个矩形类&#xff08;Rectangle&#xff09;&#xff0c;包含私有成员宽度&#xff08;width&#xff09;、高度&#xff08;height&#xff09; 包含公共成员函数&#xff1a; 初始化矩形&#xff08;init&#xff09; 设置宽度&#xff08;set_w&am…

给儿童掏耳朵用哪个好?儿童耳勺最建议买的五个牌子

儿童的耳朵清洁是家长最烦恼的事情之一&#xff0c;近年来传统耳勺出现的意外新闻颇多&#xff0c;棉签等工具的表面粗糙&#xff0c;稍不注意就会刮伤儿童脆弱的耳道肌肤&#xff0c;那么除了这些以外&#xff0c;给儿童掏耳朵用哪个好&#xff1f; 小编建议家长都入一个可视挖…

唤醒数据中台潜力,加速数据飞轮转动:数据驱动秘籍

在这个数据爆炸的时代&#xff0c;企业的数据资产正变得越来越重要。然而&#xff0c;收集和存储数据只是数据驱动旅程的第一步。如何唤醒这些沉睡的数据&#xff0c;真正让它们为业务服务&#xff1f; 这才是企业成功的关键。 数据中台曾被视为整合企业内外数据资源的利器&am…

javascript 3 个有序点的方向(Orientation of 3 ordered points)

给定三个点 p1、p2 和 p3&#xff0c;任务是确定这三个点的方向。 平面中有序三重点的方向可以是 逆时针 顺时针 共线 下图显示了 (a,b,c) 的不同可能方向 如果 (p1, p2, p3) 的方向共线&#xff0c;则 (p3, p2, p1) 的方向也共线。 如果 (p1, p2, p3) 的方向是顺时针&a…

Python GUI 编程:tkinter 初学者入门指南——窗口

目录&#xff1a; 创建窗口更改窗口标题更改窗口大小和位置窗口在屏幕上居中窗口设置的其他属性 Tkinter 是在 Python 中开发 GUI&#xff08;图形用户界面&#xff09;最常用的库。在本指南中&#xff0c;我们将引导您了解 Tkinter 的基本知识&#xff0c;学习如何使用 Tkinte…

Vue3:自定义事件实现组件通信

目录 一.性质 1.双向通信 2.灵活性 3.传参能力 4.声明机制 5.事件验证 6.修饰符支持 7.响应式更新 8.解耦组件 9.易于测试 10.性能优化 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 在Vue3中&#xff0c;自定义事件是实现组件间通…

NLP(二)-文本表示

One-hot One-hot&#xff08;独热&#xff09;编码是一种最简单的文本表示方式。如果有一个大小为V的词表&#xff0c;对于第i个词$w_i$&#xff0c;可以用一个长度为V的向量来表示&#xff0c;其中第i个元素为1&#xff0c;其它为0.例如&#xff1a; 减肥&#xff1a;[1, 0,…

C++11之统一的列表初始化

一.{}初始化 在c98中&#xff0c;标准允许使用{}对数组或结构体元素进行统一的列表初始值设定&#xff1a; struct mess {int _x;string _str; }; int main() {//注意&#xff0c;使用new的一定是指针int* arr new int[4] {1, 2, 3, 4};//数组初始化int arr[] { 1,3,5,6 };…

深度学习激活函数

激活函数是神经网络模型重要的组成部分&#xff0c;本文作者Sukanya Bag从激活函数的数学原理出发&#xff0c;详解了十种激活函数的优缺点。 激活函数&#xff08;Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模…

linux之nacos安装

1:下载nacos安装包 方式一、进入官网下载压缩包 官网地址 找到nacos-server-2.0.1.tar.gz 点击进行下载&#xff0c;下载完成后上传到服务器中。 方式二、使用wget命令下载 也有两种方式&#xff1a;第一种下载速度较慢 wget https://github.com/alibaba/nacos/releases/downl…

圆柱包围框-Bounding Cylinder-原理-代码实现

定义&#xff1a;使用一个圆柱体包围点云的所有点&#xff0c;通常用于长柱状物体。 优点&#xff1a;适合于柱状或长条形的点云。 缺点&#xff1a;计算较为复杂&#xff0c;尤其是确定圆柱体的轴线方向和半径。 找到圆柱尽量满足下面条件 找到能够完全包围3D物体的最小圆柱…

户外无线麦克风哪个牌子好,降噪麦克风哪个牌子好,领夹麦推荐

对于热爱记录与户外直播的自媒体人来说&#xff0c;一款高性能的无线领夹麦克风决定了音频的质量。市场上虽有品牌如大疆、罗德、西圣等凭借技术创新引领潮流&#xff0c;但同时也存在一些产品&#xff0c;因设计缺陷在运动时声音捕捉不稳定。作为运动爱好者与音频设备测评师&a…