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.mfbz.cn/a/881708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列&#xff0c;均为数值类型&#xff0c;同时在数据库中录入测试数据&#xff0c;Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类&#xff0c;其中Age、Height属性均为可空类型。   当Where函数中的检索条件较多时&a…

【Elasticsearch系列四】ELK Stack

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

Wpf使用NLog将日志输出到LogViewer

1 LogViewer LogViewer是通过UDP传输的高性能实时log查看器。 具有一下特性&#xff1a; 通过UDP读取日志通过文件导入日志导出日志到一个文件中排序、过滤&#xff08;日志树&#xff0c;日志等级&#xff09;和查找突出显示搜索文本从UPD接收日志时忽略IP地址列表多接收器支…

RabbitMQ08_保证消息可靠性

保证消息可靠性 一、生产者可靠性1、生产者重连机制&#xff08;防止网络波动&#xff09;2、生产者确认机制Publisher Return 确认机制Publisher Confirm 确认机制 二、MQ 可靠性1、数据持久化交换机、队列持久化消息持久化 2、Lazy Queue 惰性队列 三、消费者可靠性1、消费者…

【吊打面试官系列-MySQL面试题】MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么&#xff1f; 以下是 MySQL_fetch_array 和 MySQL_fe…

[数据结构与算法·C++] 笔记 1.4 算法复杂性分析

1.4 算法复杂性分析 算法的渐进分析 数据规模 n 逐步增大时, f(n)的增长趋势当 n 增大到一定值以后&#xff0c;计算公式中影响最大的就是 n 的幂次最高的项其他的常数项和低幂次项都可以忽略 大O表示法 函数f&#xff0c;g定义域为自然数&#xff0c;值域非负实数集定义: …

C++/Qt 集成 AutoHotkey

C/Qt 集成 AutoHotkey 前言AutoHotkey 介绍 方案一&#xff1a;子进程启动编写AutoHotkey脚本准备 AutoHotkey 运行环境编写 C/Qt 代码 方案二&#xff1a;显式动态链接方案探索编译动态链接库集成到C工程关于AutoHotkeyDll.dll中的函数原型 总结 前言 上一篇介绍了AutoHotkey…

动手学深度学习(李沐)PyTorch 第 1 章 引言

在线电子书 深度学习介绍 安装 使用conda环境 conda create -n d2l-zh python3.8 pip安装需要的包 pip install jupyter d2l torch torchvision下载代码并执行 wget https://zh-v2.d2l.ai/d2l-zh.zip unzip d2l-zh.zip jupyter notebookpip install rise如果不想使用jupyt…

Ubuntu20-xrdp与Windows-mstsc远程桌面连接

前期准备 两者在同一网段&#xff0c;网线连接。ubuntu端 sudo adduser yu //输入密码和确认密码&#xff0c;后面一路回车&#xff0c;新建用户yu&#xff0c;确保用户没有被登录 sudo apt install xrdp //安装xrdp sudo systemctl status xrdp //查看xrdp服务状态 sudo…

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后&#xff0c;效果如下。 &#xff08;1&#xff09;简单介绍本游戏项目&#xff08;待完善&#xff09; &#xff08;2&#xff09;运行效果图&#xff08;具体大家自己可以试&#xff09; 初始运行情况。 手动更换背景图。 通过子弹攻击敌机&#xff0c;累…

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学&#xff0c;这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了&#xff0c;大力赞叹华为云的 同时感谢华为云提供优惠卷&#xff0c;只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动&#xff0c;90款免…

HarmonyOS Next开发----使用XComponent自定义绘制

XComponent组件作为一种绘制组件&#xff0c;通常用于满足用户复杂的自定义绘制需求&#xff0c;其主要有两种类型"surface和component。对于surface类型可以将相关数据传入XComponent单独拥有的NativeWindow来渲染画面。 由于上层UI是采用arkTS开发&#xff0c;那么想要…

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时&#xff0c;队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展&#xff0c;如果现在负载加重&#xff0c;那么只需要创建更多的消费者来消费处理消息即可。 默…

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径&#xff0c;而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点&#xff1a; 1. 自动提取特征&#xff1a;与传统的机器学习方法不同&#xff0c;深度学习不需要手动…

【数据库】常用数据库简介

目录 &#x1f354; 常用的关系型数据库 &#x1f354; Mysql简介 &#x1f354; SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 &#x1f354; DDL语句 对数据库的操作 对数据表的操作 &#x1f354; DML语句 插入数据 insert into 修改数据 update 删除数…

python实现多个pdf文件合并

打印发票时&#xff0c;需要将pdf合并成一个&#xff0c;单页两张打印。网上一些pdf合并逐渐收费&#xff0c;这玩意儿都能收费&#xff1f;自己写一个脚本使用。 实现代码&#xff1a; 输入pdf文件夹路径data_dir&#xff0c;统计目录下的“合并后的PDF”文件夹下&#xff0c;…

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

Java_Day04学习

类继承实例 package com.dx.test03; public class extendsTest {public static void main(String args[]) {// 实例化一个Cat对象&#xff0c;设置属性name和age&#xff0c;调用voice()和eat()方法&#xff0c;再打印出名字和年龄信息/********* begin *********/Cat cat ne…

Pandas -----------------------基础知识(一)

目录 Series对象 属性和方法 布尔值列表获取Series对象中部分数据 运算 DateFrame对象 常用属性 常见方法 运算 总结 Series对象 是DataFrame的列对象或者行对象 生成Series对象生成索引使用元组创建Series对象使用字典创建Series对象 通过Pandas创建对象 自定义索引 …