在Unity中实现一个简单的昼夜系统

    最近在做一个AR体验项目里,有一个昼夜光影变换的系统需要实现,于是通过各种方式学习了一下,现在分享一下我的做法。
    第一个要考虑的就是由于我们的设计是有一个滑动条来控制当前的时间,所以这期间的光影变化是连续的,所以光照这里我选择了实时光照,当我控制滑动条的时候,实质上控制的就是我的主光源DirectionalLight的旋转角度,我这里主要是控制的是它x轴方向的欧拉角,当他的数值是90的时候意味着关照是垂直向下的,可以理解为是正午12点,如果你想要同时看到太阳所在的位置,可以考虑在lightsetting里给当前场景添加一个天空盒的材质,可以选择procedural的这个shader,当然也可以是其他的,在lightsetting里天空盒下面的选项可以设置一个平行光来作为太阳当前所在的位置。 如果你觉得这个光线的角度太正了,可以适当调节主光源y轴的欧拉角,使他有一定的偏斜。
    其实有了上述第一点,就已经能实现通过控制主光源的x轴的欧拉角来模拟当前太阳的时间了,但是整体上还是不够好,比如其实一天中我们看到的光线的颜色其实是不太一样的,比如晚上的晚霞,是有一点红通通的,早上似乎是淡黄色的,晚上又似乎是黑乎乎的,总之如果你希望你的光线的颜色并不是一成不变的,就需要再引入一个叫gradient的东西,可以理解为一个拥有各种颜色的色带,会随你对他的数值的设置,返回不同的颜色给你,比如我这个色带我就做成了,凌晨3点是黑色,上午是淡黄色,中午白色,下午到傍晚是逐渐发红的,这样不同时间段之间的光线颜色就会根据gradient设置的关键点的情况做渐变插值。这样一来在太阳的角度在发生变化的时候就不只是角度的改变,同时还有颜色的变化,使得场景更加的绚丽多彩。
    当然了,由于我这边是通过一个滑动条控制时间,所以滑动条控制到哪,就设置什么样的时间的渲染效果,而如果你希望你的时间是自然变化的,那么也可以在逐帧回调里,根据游戏经过的时间来模拟时间的变化,方法就是用一个正旋函数 因为这个函数是有一定的周期性的,随着时间的变化,它的范围永远在某个值域范围内波动,这样也就可以算出大概一天时间内不同时刻光源应该的角度。
    这个就是我用unity实现的一个简单的昼夜效果,其实以前我接触unity主要是程序,它本身的渲染这部分原先基本是美术来主导,现在刚好有时间接触了这里,就顺带说两句unity的渲染怎么样,unity其实现在能做的渲染效果还是不错的,尤其是通过烘焙和一些反射探针的使用,以及后来unity自家推出的postprocessing 都对画质可以有不少提升,无非是这些渲染比较耗费资源,所以我最近也在想办法优化这里,也是在逐渐学习的过程,日后如果对渲染优化有个深刻的学习的话也会写一篇日志来专门说说这个问题。

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1