写在最前面,首先做教程发出来就是为了教会别人,所以我认为比较重要的点,我会讲解的非常明白。竟然有人感觉我教程废话多,那真是无语,我花时间把我花了更多时间研究的技术做成教程,我都没嫌麻烦,要是看客还嫌麻烦,我也不知道说什么。
第二,这将是一篇非常硬核的文章,涉及UE Unity两大引擎,材质制作,蓝图赋值,代码C#脚本等很多方向,所以是一次非常有趣的旅程。
第三,这次涉及项目资源,所以我们就仓促的新建了一个空的场景,只说技术。
第四,昼夜变化除了天空盒材质和天光还涉及场景雾效,后处理,场景里的特效,场景,无关照等很多东西,是个体量很大牵扯很多的东西。
分析UE材质
计算云图部分
计算太阳向量
地平线部分
夜晚星星与天空颜色,这里穹顶颜色和地平线颜色写着颜色节点,其实蓝图里也有其他赋值,太阳高度也是
计算太阳颜色亮度半径
这里的云颜色部分其实也是外部传的
这里写的全局参数 其实就是颜色叠亮一些 还有一个总的覆盖乘颜色
蓝图部分
其实在蓝图顶部标签可以看出来有的是与反射相关有的是更新太阳数据,有的是构造函数。这里我们主要看一下更新太阳数据这部分
非常重要的设置光向量和设置太阳高度,太阳高度将是移植Unity时非常重要的参数
后面这根据太阳高度,对地平线颜色渐变,穹顶颜色渐变,云图颜色渐变进行赋值,其他不太重要,就不说了,因为这个技术需要说的东西太多了只讲些关键部分
这个是蓝图传的全部参数,红框里比较重要,像反射材质这部分没做Unity用反射探针 光探针啥的应该就可以,我就没留意这部分
然后是颜色使用太阳位置 不勾选就是下面的自定义颜色,我费半天劲当然是为了完成他那个白昼黄昏夜晚的渐变啊,所以这个使用自定义颜色的低级表现就直接跳过了。
太阳亮度,云速度,云透明度,星星亮度这些在在材质里计算就行了,蓝图对他们没有太多传值赋值。
接下来是三个颜色渐变,算是比较核心的地方,太阳高度,地平线这些都是蓝图参与计算的。
UE所涉及的东西应该都研究过了
接下来是资源相关
贴图
模型
三张颜色渐变-这根本不是贴图,没办法导出,这就很讨厌了
接下来进入到Unity环节
导入天空盒模型,添加地面,导入贴图
几乎与UE一样的云图算法
地平线部分这里与UE有区别,这个很明显就是UE是Z是-1,Unity里我设置Y为-1,最终表现一致,因为他们的空间轴向应该不一样
太阳计算,经典VdotL
接下来就是Unity这最重要的部分了
根据天空高度的渐变,这里比较大的问题也逐渐暴露出来,开始笨比的我尝试使用渐变图去与计算但是结果并没达到预期,然后UE的渐变颜色也不是图片,截图出图片,都试过并不好,最后我突然想起来我可以使用重映射的办法把太阳高度设置从-1到1,转成0-1的渐变滑杆。
这里说个太阳高度也还要好好解释一下
重点1
进入灵魂作画时间 太阳高度 太阳旋转角度 地平线 天空 我都说的比较明白了 这个也是算是最终要的地方了
UE里的太阳高度设置方法 其实都差不多都是拿太阳光旋转
接下来说渐变 之前可以看到UE的渐变是-1到1
Unity ASE中的渐变是0-1的
所以我把太阳高度重映射了一下吧-1到1 映射到了0-1 这样就能准确的拿到对应时间的颜色值
星星亮度这里也做了与太阳高度的关系绑定,首先星星只在黑天时候有,也就是0- -1这个区间 我把-1 ~ 1
重映射至 1 ~ -1 这样就是 在取0 ~1 这样 0 ~1的区间 就是黄昏到黑天这样乘在星星强度上正好 比较好理解
其余部分几乎和UE一样就没啥好说的
以上就是Unity中的材质全部算法
接下来进入到脚本环节
本来只有太阳高度 -1 到1 只有从白天1 到黑夜-1 这么一个过程,我发现没办法从黑夜到白天
我们需要再引入一个数值来完成 白天到黑天到白天的完整流程
重点2
于是我在脚本里也引用了太阳光,记得之前说的太阳光角度吧, 0 日出黄昏 90正午 180日落 270黑夜
这里我用的是90*(-3~1);
这里写下对应关系 1 0 -1 0 1 太阳高度 白天 日落 黑天 日出 白天
太阳角度 90 0 -90 -180 -270 换算就是 1 0 -1 -2 -3(1)
因为前部分-1之前都是一一对应的,后面我就做了 如果小于-1的话 |太阳角度乘积 + 1| -1 这样就能完成后半部分映射
这个地方我也转了半天,我感觉我好像做麻烦了 反正这部分很有趣
然后就是zhouye - Time.deltaTime * Speed 很好理解
如果小于-3 返回1 完成昼夜变化
这次做法并不是全部都完成了,只能说吧核心完成了,其实画面表现还有层与层的混合我觉的还是有些瑕疵的,暂时这样要去继续做优化和完善了。
以上就是Unity 移植UE天空盒的全部算法