Unity - 搬砖日志 - BRP 管线下的自定义阴影尺寸(脱离ProjectSettings/Quality/ShadowResolution设置)
创始人
2024-05-29 16:02:50
0

文章目录

  • 环境
  • 原因
  • 解决
    • CSharp 脚本
    • 效果预览 - Light.shadowCustomResolution
    • 效果预览 - Using Quality Settings
  • 应用
    • ControlLightShadowResolution.cs Component
    • Tools Batching add the Component to all Light
  • References


环境

Unity : 2020.3.37f1
Pipeline : BRP


原因

(好久没搬砖了,偶尔健身一下,顺便将这些无技术含量的内容,记到 blog,不要记在脑子)

最近给项目做优化的过程中
发现 BRP 管线下的 Shadow Resolution 只能在 Project Settings/Quality/Shadow Resolution 去设置
而且发现
Shadow Resolution 的一些枚举为:

  • Low Resolution - 1K
  • Medium Resolution - 2K
  • High Resolution - 4K
  • Very High Resolution - 4K (这个可能因硬件不同而不同)

在这里插入图片描述

在这里插入图片描述


解决

但是如果想要设置更小的 shadow resolution 的话,这步就没辙了?
还好我去公司中台请教了 TA 专家,他说 BRP 中一样是可以设置的

在这里插入图片描述


CSharp 脚本

// jave.lin 2023/03/06 custom shadow resolution
// refer to : https://docs.unity3d.com/Manual/shadow-mapping.htmlusing UnityEngine;public enum eCustomShadowResolution
{UsingQualitySettings = 0,Low = 128,Medium = 256,High = 512,VeryHigh = 1024,
}[ExecuteInEditMode]
public class LightCustomShadowResolution : MonoBehaviour
{public bool runInUpdate = true;public eCustomShadowResolution shadowSize = eCustomShadowResolution.High;private Light lightComp;private void Update(){if (runInUpdate){if (lightComp == null){lightComp = GetComponent();}if (lightComp == null){return;}lightComp.shadowCustomResolution = (int)shadowSize;}}
}

效果预览 - Light.shadowCustomResolution

Light.shadowCustomResolution = val

  • 这个 val 不等于 0 的话,就是自定义设置,这个 val 会自动 mostest NPOT == Mostest Next Power Of Tow
  • 这个 val 等于 0 的话,就是使用 Quality Settings 的全局配置
    请添加图片描述

效果预览 - Using Quality Settings

请添加图片描述


应用

只需要编写工具,批量对项目中的 Scene、Prefab,遍历其下所有 Light 的 GameObject 添加 改组件即可


ControlLightShadowResolution.cs Component

// jave.lin 2023/03/06 control light shadow resolution, [attach to light]using UnityEditor.SearchService;
using UnityEngine;
using War.Script;[ExecuteInEditMode]
public class ControlLightShadowResolution : MonoBehaviour
{public eLightShadowResolutionFollowQualitySetting followQualitySetting;public int shadowSize;#if UNITY_EDITORpublic bool runInUpdate = true;
#endifprivate Light lightComp;private void Start(){int level = UIInterface.GetCsharpEventCenterLevel();OnQualityLevelChanged(level);// TODO: xxx 修改为对应的时间名EventMgr.Instance.RemoveEvent("xxx", OnQualityLevelChanged);EventMgr.Instance.AddEvent("xxx", OnQualityLevelChanged);}private void OnDestroy(){// TODO: xxx 修改为对应的时间名EventMgr.Instance.RemoveEvent("xxx", OnQualityLevelChanged);}#if UNITY_EDITORprivate void Update(){if (runInUpdate){ApplyChanged();}}
#endifprivate void OnQualityLevelChanged(int lv){if (followQualitySetting == eLightShadowResolutionFollowQualitySetting.On){shadowSize = 0;}else{eQualityLevel level = (eQualityLevel)lv;switch (level){case eQualityLevel.VeryLow:shadowSize = (int)eLightCustomShadowResolutionSize.VeryLow;break;case eQualityLevel.Low:shadowSize = (int)eLightCustomShadowResolutionSize.Low;break;case eQualityLevel.Medium:shadowSize = (int)eLightCustomShadowResolutionSize.Medium;break;case eQualityLevel.High:shadowSize = (int)eLightCustomShadowResolutionSize.High;break;default:break;}}ApplyChanged();}private void ApplyChanged(){if (lightComp == null){lightComp = GetComponent();}if (lightComp == null){return;}lightComp.shadowCustomResolution = shadowSize;}
}

Tools Batching add the Component to all Light

// 伪代码
var scene = EditorSceneManager.xxxByPath("xxx");
var roots = scene.GetxxxxRoots();
foreach (var root in roots)
{var lights = root.GetComponents();// 剩下的同下代码
}
    public static void AddControlLightShadowResolution(){var lights = GameObject.FindObjectsOfType();foreach (var light in lights){if (light == null)continue;ControlLightShadowResolution comp = light.transform.GetComponent();if (light.lightmapBakeType == LightmapBakeType.Realtime){if (comp == null){light.gameObject.AddComponent();}}else{if (comp != null){if (Application.isPlaying)GameObject.Destroy(comp);elseGameObject.DestroyImmediate(comp);}}}}

References

  • shadow-mapping - unity 官方 shadow map 文档

上一篇:Java String 类

下一篇:迟来的 2023 flag

相关内容

热门资讯

安卓系统的移动加密软件,安全守... 你知道吗?在这个信息爆炸的时代,保护个人隐私变得尤为重要。而手机,作为我们日常生活中不可或缺的伙伴,...
最低安卓系统淘汰时间,揭秘最低... 你知道吗?在科技飞速发展的今天,手机更新换代的速度简直就像坐上了火箭!这不,最近有个话题在数码圈里炒...
安卓系统什么框架好用,探索最佳... 你有没有想过,你的安卓手机里那些应用,是怎么运行得那么顺畅的呢?其实,这背后可是有“大功臣”的——那...
平板安卓系统和ios,安卓与i... 你有没有发现,现在身边的朋友几乎人手一台平板电脑呢?无论是追剧、办公还是游戏,平板电脑都成了我们生活...
安卓的定位系统叫什么,GPS导... 你有没有想过,你的手机是怎么知道你在哪儿的呢?是不是觉得这事儿很神奇?其实,这背后有一个强大的技术支...
老式电视安卓系统升级,解锁智能... 你有没有发现,家里的老式电视突然变得聪明起来啦?没错,就是那个陪伴我们多年的老伙伴,它竟然悄悄地升级...
长安车载系统升级安卓 你有没有发现,最近你的长安车好像变得聪明多了?没错,就是那个车载系统,它悄悄地进行了安卓升级,简直就...
安卓系统损坏标志图,故障原因与... 手机突然间闹起了脾气,屏幕上那个安卓系统损坏的标志图,简直就像是个不速之客,突然闯进了你的生活。别急...
安卓系统自带投屏,轻松实现多屏... 你是不是也和我一样,有时候想把自己的手机屏幕上的内容分享给朋友或者家人看,但又觉得用数据线连接太麻烦...
mac可以下安卓系统么 亲爱的果粉们,你是否曾有过这样的疑问:Mac可以下安卓系统吗?这个问题,不仅让你我好奇,也让不少科技...
diy主机安卓系统推荐 亲爱的DIY爱好者们,你是否曾梦想过拥有一台完全由自己组装的安卓主机?想象一台运行流畅、功能强大的安...
安卓13系统可以安装吗 你有没有听说安卓13系统已经发布了?是不是迫不及待想要升级你的手机,体验一下新系统的魅力呢?不过,在...
手机壳平价推荐安卓系统,时尚与... 手机壳可是咱们手机的最佳守护者呢!想象你的宝贝手机在日常生活中难免会遭遇各种“小意外”,有了手机壳,...
麦芒是安卓系统吗,深度解析安卓... 你有没有想过,手机里的那个麦芒,它是不是安卓系统呢?这个问题,估计不少手机控都好奇过吧!今天,就让我...
苹果x系统感觉像安卓,安卓风潮... 你有没有发现,最近苹果的X系统好像有点儿像安卓呢?是不是觉得苹果的“高贵”形象突然变得有点儿接地气了...
小米的安卓系统设置在哪,轻松生... 你有没有发现,小米手机的操作界面简洁又美观,功能强大到让人爱不释手?但是,有时候你可能会觉得,这个设...
安卓系统荣耀排第一,引领智能手... 你知道吗?在智能手机的世界里,有一个系统可是风头无两,那就是安卓系统!而在这众多安卓手机品牌中,有一...
充电宝带安卓系统,便携式智能电... 你有没有想过,你的充电宝也能拥有自己的操作系统呢?没错,就是安卓系统!听起来是不是很酷?想象你的充电...
安卓类原生系统手机推荐,精选原... 你有没有想过,拥有一部安卓类原生系统手机,就像是拥有了掌控自己世界的魔法棒?没错,原生系统带来的流畅...
努比亚安卓13系统下载,下载与... 你有没有听说?努比亚手机最近可是大动作连连呢!他们推出了全新的安卓13系统,而且现在就可以下载啦!是...