关于游戏中的光(一):极光的做法

WalkingFat

2022-12-211637次浏览

0评论

23收藏

7点赞

分享

制作极光的方式很多,想做真实做好看有两个重要的点,1是极光的动态,2是极光的厚度体积感。

先上个动图演示:

制作思路:

如果只是在地表上看极光(不用飞到极光里去),是有简单的方式模拟出极光厚度的。我一开始想到的是用视差贴图,我之前做的动态天空球是一个半球体,并且把各种天体云层都画在一个pass里,所以如果用视差贴图做,就会沿着法线向外发散。而真实的极光厚度应该是垂直地表的。

所以我想到个简单的方式,就是在屏幕坐标上假定一个天顶的轴点(0.5, 4),极光的贴图直接以这个轴点偏移多次绘制,可以模拟出垂直地表的厚度。但这个方式是有缺点的,如果camera可以一直仰望90°以上的话就会穿帮。所幸大部分游戏camera都会锁到90°仰望角,所以用这个trick做法是ok的。

左图视角控制在0-90度就没问题,能感受到近似垂直于地面的厚度;右图如果仰角大于90度,看上去厚度就不垂直于地面了。

具体实现方式:

先定义2个RT,用来之后做厚度来回Blit。可以降采样,我用的1/4分辨率。

第一个pass绘制基础的极光曲线。我直接用sin,cos函数根据世界坐标计算出3根极光曲线,并且带一些随机厚度变化,为了之后做出极光垂直一缕一缕的效果。

这个pass的R通道是极光曲线,G通道输出天空与玩家的距离值,为了以后做极光的fade out和厚度变化。

第二个pass绘制极光厚度的渐变。做法就是以虚拟天顶的屏幕UV坐标(0.5,4)为轴心,偏移采样16次(这里的次数可以根据厚度需要缩减),绘制出极光厚度和颜色渐变。是不是有点像小时候玩的塑料弹簧玩具?

这里也用到了之前第一个pass的Y通道的距离,用来控制远处的极光厚度变窄,强度变弱,做出大纵深的视觉冲击感。

第三第四个pass就是做2次轴向模糊,一个pass做8次采样,2个pass足够画出平滑的厚度了。

最后把这RT传给天空球的材质,叠加上去就完成了。

波形写的比较简陋,3条波会交错穿插。

效果优化:

代码算出来的3根极光曲线感觉不是很自然,之后我又试了一下直接采贴图的方式。用perlin噪点让平行线扭曲,这样可以画出自然的极光线条。(RG通道2种输密线用来模拟强度变化)

扭曲会有些波形粘连的状态,不像代码写的波形那么规整,各有各的优缺点吧,都是靠时间经验磨。

然后加上了控制强度的参数

总结

这个做法用了2个1/4分辨率的RT,4个Pass,其中渐变和模糊pass用的采样数比较高,但这些多次采样是用在1/4分辨率RT上的,总体开销还能接受吧。

总之极光也就是个添彩的效果,如果性能还有富余的话可以尝试加加看。

评论 0

0/1000
网易游学APP
为热爱赋能
扫描二维码下载APP