小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
需求
常规的unity烘焙光照探针 是采用3阶球谐来存储的 有9个float3数据,一般项目探针数量不会太多所以不用考虑内存问题。但我参与的 生死狙击2 (可点击看游戏视频)项目 ,有开放大世界,所有 lightmap加lightprobe 显存开销巨大500多M。所以我实现了一套VLM烘焙方式,提高10倍的烘焙速度 和 节省22倍的显存开销.这套方案太复杂 我这里只是分享其中的一个压缩技术。如果你也因为其他原因需要压缩 或因为球谐模型尾巴有漏光问题需要解决 可以参考下我的做法。
基础思路
首先想到的肯定是 2阶球谐来存,因为不少大佬说过精度也够。而且unity的realtime gi好像就是用的2阶.我没有采用2阶的原因是球谐算法没有完全掌握,根据颜色反向构建和压缩 特别是工具修复漏光时 需要用到 半球拷贝(对sh某个方向的颜色拷贝到另一个sh的某个方向)都很不好掌控,虽然能找到算法但如果你和我一样 对自己没完全掌握的算法用起来有点担心 ,那么就适合这样直观的方式来存储。
我们用一个丰富点的烘焙情况做为测试基准
首先想到的是cubemap xyz正负方向6个方向分别存一个颜色,采样的时候只需要 计算6次max(0,dot(dir,normal))*colr;就可以得到个不错的结果 如下图
升级思路 (正戏开始)
虽然模拟了个大概但,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张图存储。效果但看误差严重实际上效果 间接光贡献度不大 这点差距不敏感
代码也很简单 ,为什么要比直角坐标系 +1/3 可以自己思考下,实际上可以进一步压缩掉75% ,因为 可以某大区域只设置一个颜色 然后只记录间接光的强度,这样4个强度刚好一个rgba图就可以存入 只有 引擎的 1/7容量。如果这种极限压缩不符合项目,那么可以让一个场景只用256种颜色 然后每个探针多一个byte 存入颜色索引,256色配合256强度 和插值计算也很丰富了。
端游项目实装效果
重大内存/显存收益
0.58G 到23M 压缩到原来的3.87%
当然内存/显存巨大收益并非直接来自这个探针方案而是来自我VLM的实现,VLM大量探针用了本方案。
以上是“unity3d中光照探针的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。