云雾一直都是各个游戏烘托场景氛围的主要组成部分,而这种很难对其感性审美效果进行参数化的东西,无论是在美术工作流中还是渲染技术中都是比较难以处理的。最近接到的项目需求中有诸多涉及各个使用场合的云雾效果,此文姑且算是一个尝试过的几种方案的介绍与小小总结吧:
一、单片云雾
特效片大概是最简单最普遍的做云雾效果的方式了。功能上没有太多好说的,比较常规:双层噪声扰动贴图制作边缘拉丝,使用场景深度做软粒子效果,使用相机深度做渐隐渐出效果,锁y轴与不锁轴的billboard。功能大差不差都那几个,但是这个片的光照以及消隐动态效果,根据使用场合不同,会有不同的处理。而且如果这种资产量很大,实际上是非常费美术的,所以资产制作上也需要一些更能把控效果同时提高效率的方式。
先说说光照。一般来说,可以把云的光照拆开成几个部分来处理:本体的整体明暗比例,边缘光,环境光(天光、地光)。其次,方向光是否能够改变本体的明暗方向,也是一个会影响整个制作流程的要点。如果云片不会根据方向光产生明暗方向变化,那其实只需要两个贴图通道,存放前两个值就行。环境光的采样可以根据像素的Y构建函数算出上部往上,下部往下的法线去采样,或者可以根据明暗比例来区分采样方向,明部采样上方向,暗部采样下方向来处理。前面两个通道的光照可以在houdini中生成,大体工作流为美术用基本几何体搭建云的大体形状,TA进行houdini中的云生成和打光渲染。基本上和美术对接一两次,houdini中天光的参数,方向光的方向与数量大致就能确定下来了。然后就可以进行hda封装,让美术使用工具自己调参生成资产就可以了。测试时的几个渲染截图效果如下:
引擎中渲染如下:
除了houdini,还有一个比较好用的工具叫做KumoWorks,可以通过自己画的2D形状来生成带光照的云雾贴图,参数也比较美术友好。只是写实的程度以及精度都有限,不过要求不高用用还是可以的。
对于方向光能影响云片明暗的需求,尝试过的方式是根据云的厚度图来生成法线,然后进行普通的表面渲染。
尝试过挺多种方式处理这张法线,但是感觉得到的光照结果明暗交界都太过硬(做了多次模糊之后依然很硬),不符合项目那边的要求,遂没有继续尝试下去了。
还有了解到的一种方式是制作多向的明暗比贴图,然后根据光照方向作为多向贴图的混合权重。看了网上几个大佬的尝试,感觉这个方式效果挺好的,但资产确实是要更多一些,就看项目如何权衡了。
对于云片的消隐,最直接的方式是制作序列帧动画,也是比较费美术的方式。目前尝试的方式是,把打光完带明暗比的云片丢进PS里头,用阈值工具划分出几个明度状态,然后用输出的几个状态图生成sdf图补充过渡区域,在shader里step一下就能平滑消隐了。消隐方向以及细节可以通过调整打光来控制,固然是需要一定的调整经验的,但比起逐帧画还是比较效率的吧。尝试时的几个状态截图:
二、天空盒云
其中一种方案是带光照偏移的noise云。效果如下视频:
基底是常规的多层叠加noise云。使用贴图三个通道存储scale不同的三张四方连续的密度图,然后在shader中进行有限次的UV空间步进采样之后进行密度加权叠加得到基础的形态。而光照偏移的效果,首先在CPU端传入以太阳为起点往光照方向射出的射线与天空盒云的mesh(在这是个半球)的第一个交点对应的uv坐标,然后就可以计算出每个像素的uv到交点uv的距离。根据这个距离进行不同的数值处理,偏移采样uv,就可以做出这种效果了。现在看来,这种方式会在光照方向水平的时候出现瑕疵,如果在能够接受这种云的美术效果的前提下,加入光照临近水平方向的特殊处理倒是也还能看得过去。(或者直接进行快速切换/太阳月亮永远不下落等等)这个方式主要是性能很好,同时也能有光照方向响应。
以上是几个从渲染效果与工作流的角度来考虑的项目中云雾效果的应用分享,除此之外固然还有许多相关的技术,譬如体积云,天气系统交互等等。这些比较复杂的系统后续有机会的话再进行分享吧。本文权当抛砖引玉,如有说的不对的地方还请提出,感谢阅读!
欢迎加入我们!
感兴趣的同学可以投递简历至:CYouEngine@cyou-inc.com