文章目录

  • 环境
  • 原因
  • 解决
    • 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<Light>();}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<int>("xxx", OnQualityLevelChanged);EventMgr.Instance.AddEvent<int>("xxx", OnQualityLevelChanged);}private void OnDestroy(){// TODO: xxx 修改为对应的时间名EventMgr.Instance.RemoveEvent<int>("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<Light>();}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<Light>();// 剩下的同下代码
}
    public static void AddControlLightShadowResolution(){var lights = GameObject.FindObjectsOfType<Light>();foreach (var light in lights){if (light == null)continue;ControlLightShadowResolution comp = light.transform.GetComponent<ControlLightShadowResolution>();if (light.lightmapBakeType == LightmapBakeType.Realtime){if (comp == null){light.gameObject.AddComponent<ControlDepthMode>();}}else{if (comp != null){if (Application.isPlaying)GameObject.Destroy(comp);elseGameObject.DestroyImmediate(comp);}}}}

References

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

Unity - 搬砖日志 - BRP 管线下的自定义阴影尺寸(脱离ProjectSettings/Quality/ShadowResolution设置)相关推荐

  1. Unity - 搬砖日志 - 打开项目时崩溃/或是运行不起unity的日志

    崩溃日志目录所在:C:/Users/admins/AppData/Local/Unity/Editor/Editor.log 其中 admins 是你的 windows 登录账号名 打开该 Edito ...

  2. Unity - 搬砖日志 - Occlusion Culling 关闭动态遮挡剔除 Renderer.allowOcclusionWhenDynamic = false

    文章目录 CullDynamicObjectsWithUmbra 消耗 如何禁止 动态对象的遮挡剔除的消耗 写工具来遍历 Renderer.allowOcclusionWhenDynamic = fa ...

  3. Unity - 搬砖日志 - 获取 LODGroup 当前显示的 LOD 级别

    最近 QA 同学需要在 某个 LODGroup 对象,当前显示的 LOD 是哪个级别的功能,所以上网搜索了一下,发现:Current LOD level - LOD Group Unity 也有人需求 ...

  4. Unity - 搬砖日志 - Android 的 Optimized Frame Pacing - 对应 ProjectSettings 配置字段:androidUseSwappy

    备忘用,因为 project settings 动不动,会提交一堆不相关的配置字段修改 Unity PlayerSettings 的 GUI 上 Optimized Frame Pacing 和 实际 ...

  5. Unity Shader - 搬砖日志 - URP PBR (抄作业篇,持续更新~)

    文章目录 目的 环境 PBR 主要渲染方程 D 项 GGB(desmos) D_Term 完整 Shader G 项 GGB G_Term 完整 Shader F 项 GGB F_Term 完整 Sh ...

  6. Unity Shader - 搬砖日志 - Dithering

    文章目录 什么时 Dithering 色阶纹理图案 - Texture Dither Pattern 程序化 动态 Dithering - 让 RGBA8888 压缩到 RGBA4444 而没有明显色 ...

  7. Unity Shader - 搬砖日志 - 3D Noise, Noise 3D 相关

    文章目录 GLSL noise 3d Project References 备忘,2D 的 noise 有纹理或是现成的比较多 3D noise 在 unity SG 出奇的没有封装 显示再 shad ...

  8. Unity Shader - URP Fog - URP 管线下的雾效

    文章目录 参考 LitForwardPass.hlsl 临摹使用 Test/URPFog 只要 Fog_Linear 变体的 效果 问题 修复 References 管线:URP URP:7.7.1 ...

  9. Steam平台——全球最大的游戏平台,现在给大家介绍下steam搬砖项目,这个项目既小众又稳定。

    steam搬砖项目介绍 steam搬砖项目差不多已经存在有一些时间了,这么久以来一直非常稳定,这个项目既比较冷门又能持续稳定盈利,是一个非常不错的项目.简单来说就是从国外的steam平台购买饰品道具然 ...

最新文章

  1. Android 创建其它应该程序的上下文对象
  2. java中判断字符串乱码_java中如何判断字符串是否乱码
  3. 文本编辑器查看 cprintf颜色_airWriter for mac(文本编辑软件)
  4. Python3 实现建造者模式
  5. gentos 执行sh文件_linux定时自动清理日志文件
  6. python 切片器_PowerBI-将日期显示为星期作为切片器
  7. for和select循环语句的应用实践
  8. 敏捷个人A2组第一次讨论纪要 如何让别人乐于帮助你?
  9. K3-openwrt交换机模式-挂载磁盘-部署kodexplorer可道云私有云盘-极简单版
  10. java视频生成缩略图_Java——使用javacv生成视频缩略图
  11. html顺势正旋转360度,庞明:混元太极揉球
  12. 插入图片的时候,总是只是能漏出一点点其他部分都看不到,改变格式从插入型改成浮于文字上方才能完全显示,但浮于文字上方的格式最后不好排版和编辑,稍微一改,整个就乱了,求助如何让插入型的文字图片完全显示出来
  13. VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)
  14. 向服务器获取同步信息失败,主域服务器和辅助域服务器数据同步失败
  15. Master-MatPyon:学习历程
  16. 音频处理工具 sox 使用
  17. Java模拟鼠标键盘输入事件 --- Robot 类
  18. iphone开发 UIButton使用
  19. UltraISO+U盘制作启动盘安装各种系统
  20. 2015年01月02日

热门文章

  1. 我的Surface Book装机清单
  2. java enclose class_Enclosing Class
  3. 打造量声定制的观影体验!三星Neo QLED获得VDE空间声音优化认证
  4. L2之上的L3、L4,StarkWare的这个设想到底能否实现?
  5. 模型构建器之提取水系
  6. 图的遍历(深度优先与广度优先)
  7. 一套键鼠操控多台主机/电脑/笔记本 - 《Mouse Without Borders》安装配置教程
  8. Linux命令行 (二)
  9. 找出最小自然数N,使N!在十进制下包含Q个0(输入Q,输出N)
  10. java笔试-小红书秋招笔试-9.6(子矩阵索引、未出现的最小自然数、航海危险区)