unity3d中光照探针的示例分析

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

成都创新互联科技有限公司专业互联网基础服务商,为您提供成都服务器托管高防物理服务器租用,成都IDC机房托管,成都主机托管等互联网服务。

         

需求

常规的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中光照探针的示例分析
本文链接:http://myzitong.com/article/gppipe.html