当前位置: 首页 > news >正文

unity 烘焙模式——baked indirect/shadow mask/distance shadowmask/subtractive模式的区别

在这里插入图片描述
在这里插入图片描述
这种烘焙模式,只烘焙间接光。
烘焙结果:
在这里插入图片描述

shadowmask模式+shadowmask Mode=Shadowmask:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
烘焙间接光,但是多了一个shadowmask
在这里插入图片描述

shadowmask模式+shadowmask Mode=distance shadowmask:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

烘焙结果无变化,但是,打开帧调试器看到:
在这里插入图片描述
这里要注意,这里我选择的是no cascades,所以只会出现一次绘制,如果是two cascases或者four cascades,则可能在shadowmap阶段绘制多次。
在这里插入图片描述

不管怎样,在shadow distance=50的时候,5个物体都是参与了实时的绘制,也就是使用了shadowmap。

在这里插入图片描述
当调整shadow distance=10的时候,那么在shadowmap阶段少了一个绘制物体,Draw Mesh Cylinder (1)
也就是说,随着shadow distance的缩小,有些物体,不参与shadowmap的绘制,而直接使用了shadowmask。
具体在看:Draw Mesh Cylinder(1)的shader关键字:
在这里插入图片描述
此时只打开了这几个关键字:
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON SHADOWS_SHADOWMASK
也即是使用了SHADOWS_SHADOWMASK
而如果改为shadow distance=50,那么会有什么变化呢?
在这里插入图片描述
注意此时,打开多了一个关键字
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON SHADOWS_SCREEN SHADOWS_SHADOWMASK
也即是使用了unity的屏幕空间阴影,也就是上面的shadowmap阶段中,绘制的深度图,然后再blit的屏幕,也就是实时绘制阴影了+shadowmask的两者的融合。

我们再看看,如果只使用
shadowmask模式+shadowmask Mode=Shadowmask:
此时帧调试器的状态,应该为没有shadowmap阶段,全是使用shadowmask才对。
在这里插入图片描述
果然,shadowmap阶段都没了。

所以distance shadowmask,相较于shadowmask会效率低一下。但是可以在distance之内获得实时绘制阴影的效果。

我们在看看阴影质量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以当在distance=50的时候,由于使用了shadowmap+shadowmask,阴影更加的柔和。
而如果是distance=10的时候,则阴影会有点坚硬。
而如果是distance=0,相当于是直接使用shadowmask,阴影也相对柔和,但是依然没有shadowmap+shadowmask软。

ok我们知道了,在使用distance shadowmask的时候,在小于distance的时候,使用shadowmap+shadowmask的融合,这样就会有个问题:
如果我们调整了光源的方向,会出现叠影:
在这里插入图片描述
如上图,只有黄色的将头的物体,没有出现谍影,为啥呢?因为其是使用的全是shadowmask,所以不会有叠影。
而其他的物体,都是shadowmap+shadowmask,而此时shadowmap已经是在光源方向改变的情况下,所以融合的有点问题。

在这里插入图片描述
所以这种情况下,最好是光源的方向不要变化。否则会有问题。

最后是subtractive模式:
在这里插入图片描述
在这里插入图片描述
此时是将直接光+间接光+阴影都烘焙到光照贴图上了。无shadowmask
在这里插入图片描述
所以会更加亮一下。此时帧调试器的情况,无shadowmap阶段:
但是打开了宏:
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING

在这里插入图片描述
此时灯光,改变方向与否已经无法影响静态物体的阴影了。因为全部是使用静态的烘焙的图了。

总结:
1、此篇博客,主要总结了使用mixed灯光的烘焙,分布有:
baked indirect——只烘焙间接光,直接光实时计算,阴影实时计算
distance shadowmask——只烘焙间接光,直接光实时计算,在distance之内(shadowmap+shadowmask融合),distance之外(shadowmask)
shadowmask——只烘焙间接光,直接光实时计算,所有物体都使用shadowmask计算阴影
subtractive——烘焙间接光+直接光+阴影,都是静态,无shadowmask图

2、shadowmask是静态的图,记录的是,每个像素能够被哪盏灯照亮,黑色表示无灯光照亮这个像素。其他颜色,如(1,0,0,0)表示,只受一个灯影响,再比如(1,1,0,0),表示受两个灯影响。一个像素最多收到四个灯影响,多于四个灯影响,unity将其不重要的灯,使用baked模式处理。

3、shadowmap是动态,是参与实时计算的,是参与深度图绘制的,是参与到灯光空间深度绘制的,这些都是一个意思。

4、烘焙质量的选择,如果只使用间接光光照,也就是只需要记录间接光,那么则可以选择baked indirect模式,distance shadowmask,或者shadowmask,都可以,因为我们的颜色图,都记录的只是间接光颜色。而subtractive为啥不行呢,因为其颜色图记录了直接光+间接光+阴影,所以不行。
而此时对于阴影,我们一般是自己写实时的阴影,也不会用unity自己的阴影,因为unity模式是使用屏幕空间阴影,三次全场景的绘制不说,还用了3个rt,占用内存。所以一般是自己处理物体的阴影,处理的方案,我这里顺便说下:
首先,区分动态物体、静态物体、自阴影
动态物体,是场景中能够移动的物体,如角色,怪物等等。草和树处理暂时不知道,草应该不会释放阴影,不参与阴影的计算,树呢?树应该当做静态物件处理。
静态物体,是场景中的物体,不如建筑物,篱笆,等,这些物体的阴影可以在出现在人的视野的时候,进行绘制阴影,使用rt策略,其实也就实时绘制,不过要做好缓存机制,不要每帧都绘制,只在物件出现在视野的时候才绘制rt深度。
自阴影,一般是主角上,并且是在展示界面,而不会全场景的角色,或者身边几个角色支持自阴影也可以,但总之也是会有一个rt的内存耗用,还有增加多个drawcall。
总之,如果抛弃了unity的阴影,那么所有的阴影(动态物体、静态物体、自阴影)都得自己搞,策略都是自己定。
ok,大致就这些,关于烘焙还有好多的细节,包括参数的调整,2号uv的问题,接缝的问题,分辨率的问题,烘焙时间的问题,以及scale in lightmap的问题,等等,后面再学习,再补充。

相关文章:

  • 第七章学习小结
  • unity_worldtransformparams.w
  • vue使用install函数把组件做成插件方便全局调用
  • 地形shader分析
  • 3.HTTP协议详解
  • C# 读取bytes——工具类
  • 三角形插值
  • iOS runLoop 原理多线程 总结 NSTimer优化
  • 克莱姆法则
  • Unity - DOTS(多线程数据导向型技术堆栈)
  • unity NativeArray
  • unity的Profiler类
  • Unity中的GC以及优化
  • ScriptableObject打包为assetbundle
  • unity中animator动态设置AnimationClip
  • angular学习第一篇-----环境搭建
  • Docker容器管理
  • es6(二):字符串的扩展
  • mongodb--安装和初步使用教程
  • nfs客户端进程变D,延伸linux的lock
  • Otto开发初探——微服务依赖管理新利器
  • v-if和v-for连用出现的问题
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从零开始在ubuntu上搭建node开发环境
  • 如何合理的规划jvm性能调优
  • 写给高年级小学生看的《Bash 指南》
  • 云大使推广中的常见热门问题
  • #13 yum、编译安装与sed命令的使用
  • (c语言)strcpy函数用法
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (七)理解angular中的module和injector,即依赖注入
  • (四)linux文件内容查看
  • (算法二)滑动窗口
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (循环依赖问题)学习spring的第九天
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)大道至简,职场上做人做事做管理
  • **CI中自动类加载的用法总结
  • ... 是什么 ?... 有什么用处?
  • .dwp和.webpart的区别
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 反射 Reflect
  • .Net6 Api Swagger配置
  • @Conditional注解详解