unity3d中光照探针的示例分析

小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

         

需求

常规的unity烘焙光照探针 是采用3阶球谐来存储的 有9个float3数据,一般项目探针数量不会太多所以不用考虑内存问题。但我参与的 生死狙击2 (可点击看游戏视频)项目 ,有开放大世界,所有 lightmap加lightprobe 显存开销巨大500多M。所以我实现了一套VLM烘焙方式,提高10倍的烘焙速度 和 节省22倍的显存开销.这套方案太复杂 我这里只是分享其中的一个压缩技术。如果你也因为其他原因需要压缩 或因为球谐模型尾巴有漏光问题需要解决 可以参考下我的做法。

基础思路

首先想到的肯定是 2阶球谐来存,因为不少大佬说过精度也够。而且unity的realtime gi好像就是用的2阶.我没有采用2阶的原因是球谐算法没有完全掌握,根据颜色反向构建和压缩 特别是工具修复漏光时 需要用到 半球拷贝(对sh某个方向的颜色拷贝到另一个sh的某个方向)都很不好掌控,虽然能找到算法但如果你和我一样 对自己没完全掌握的算法用起来有点担心 ,那么就适合这样直观的方式来存储。

我们用一个丰富点的烘焙情况做为测试基准

unity3d中光照探针的示例分析

 

 
unity引擎自带的球谐为基准  


首先想到的是cubemap  xyz正负方向6个方向分别存一个颜色,采样的时候只需要 计算6次max(0,dot(dir,normal))*colr;就可以得到个不错的结果 如下图

unity3d中光照探针的示例分析

 

 

 
6方向色模拟




渲染的算法也超简单 每个方向算权重 就可以了 是不是很接近了呢  

unity3d中光照探针的示例分析

升级思路 (正戏开始)

虽然模拟了个大概但,6个颜色 没比9个少多少 而且2阶球谐只需要4个颜色,所以我打算开始采用4方向轴。我想到正四面体,因为4个顶点是对称的 也就是数学意义完全相同的 所以中心指向4个顶点得到的4个坐标轴 两两夹角都相同,所以很适合用来建立一个4半轴坐标系(应该算非笛卡尔坐标系)  ,通过计算或查询固定的角度可以选一个4个轴的方向,我选了 一个TetrahedroDirs = { new Vector3(-0.8164966f, -0.3333331f, -0.4714046f), new Vector3(0.8164966f, -0.3333331f, -0.4714046f), new Vector3(0, -0.3333331f, 0.9428091f), new Vector3(0, 1, 0) };就是 一个顶点是向上的。因为只有4个颜色所以很好用3张图存储。效果但看误差严重实际上效果 间接光贡献度不大 这点差距不敏感

unity3d中光照探针的示例分析

unity3d中光照探针的示例分析

 

 
4半轴坐标系模拟效果  


代码也很简单 ,为什么要比直角坐标系 +1/3 可以自己思考下,实际上可以进一步压缩掉75% ,因为 可以某大区域只设置一个颜色 然后只记录间接光的强度,这样4个强度刚好一个rgba图就可以存入 只有 引擎的 1/7容量。如果这种极限压缩不符合项目,那么可以让一个场景只用256种颜色 然后每个探针多一个byte 存入颜色索引,256色配合256强度 和插值计算也很丰富了。

unity3d中光照探针的示例分析

端游项目实装效果

unity3d中光照探针的示例分析

 
传统lightmap+lightprobe烘焙 动态对象静态对象间接光不一致,但静态物件间接光丰富

unity3d中光照探针的示例分析

 
新纯探针烘焙 探针压缩方式 是案例的 4半轴坐标系方式 动静统一但细节不丰富

重大内存/显存收益

0.58G 到23M 压缩到原来的3.87%

当然内存/显存巨大收益并非直接来自这个探针方案而是来自我VLM的实现,VLM大量探针用了本方案。

unity3d中光照探针的示例分析

以上是“unity3d中光照探针的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程之家行业资讯频道!

相关文章

这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画...
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价...
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分...
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文...