闪耀暖暖开发者:从美术设计解答换装游戏的根本
|
最后是闪烁处理,我们的处理方式是利用刚才随机生成的相位值调整nh,进行高光计算。同时用一个统一的闪点光滑度控制闪烁程度。
如何管理shader材质? 由于我们使用了多UV,加上刚才各种材质特性,还需要实现不同光照模型,这样就会导致我们的shader变成一个庞大的uber shader家族,如何管理shader材质是一个重要的问题。 在工作流方面,一个自定义的材质面板是非常好用的工具,它可以在同一组shader中进行切换。同时可以开关feature,根据特性集来动态调整面板,还可以结合自己的工具进行性能分析、监控和预警。在发布和runtime方面,海量变种对编译速度非常敏感,我们去年把引擎版本从5.6升级到2018,因为2018修复了5.6的重复编译bug,同时大大提升了shader的编译速度。 光照系统:希望有更丰富的光照变化 接下来介绍一下光照系统,由三部分组成,预烘焙的环境光、主灯以及轮廓光。希望有更丰富的光照变化,单LightProbe的效果太单调,没有场景,只能烘焙一个预设的Cubemap。我们的解决方法是沿竖直方向增加LightProbe采样点,让美术增加点光源和方向光作为额外光源,将其直接关照和Cubemap一起合并到环境SH,运行时根据世界坐标的高度在vs中进行插值计算环境光。
如何处理轮廓光? 轮廓光方面,可以强调角色轮廓,增强体积感。使用轮廓光的时候,发现很多衣服存在漏光的问题,这是因为轮廓光没有ShadowMap计算。注意到漏光区域主要是局部形体,我们可以对Mesh静态结构进行预计算。 在模型导入在T-pose下后计算网格每个顶点的遮挡信息。对于每个顶点,在其球面上发射若干条阴影光线,进行碰撞测试。对于每条阴影光线,将其转化到对应顶点的切空间,并将阴影测试的结果累计入2阶SH中。最终结果是4个浮点数,可以把结果存到顶点色中。运行时把轮廓光转换到切空间采样SH进行遮挡判断。
这个是做到的结果,左侧是有轮廓光的,中间是轮廓光+遮挡,可以看到漏光形象大为缓解。因为SH近似存储所有遮挡信息,动态情况下也可以工作,即使增加轮廓光,也可以用这个方案进行统一解决,性能开销不会显著增加。 如何处理阴影? 下面是阴影处理,由于Unity5的阴影不支持半透明物件投影和受影的,我们自定义了shadow pass。同时根据相机与人物的关系可以提升ShadowMap的利用率。我们把人物的包围体按竖直方向细分,根据相机和每个小段的相交结果,调整的投影矩阵。 下面是Shadow Map的情况,右侧是关闭自适应阴影,左侧是开启,可以看到阴影质量得到了相应的提升。
角色的面部是一个重点关注区域,头发尤其是刘海处的投影如果用不透明方式处理会显得过于生硬。我们的处理方式是使用Screendoor Depth,每4×4像素为一个tile,每像素根据透明度值来顺序丢弃写深度操作。可以看到最后得到的ShadowMap,头发末端有一个点阵的状态。再用一个单独的四分之一大小RT,对皮肤做屏幕阴影蒙版,再进行模糊处理,以获得半透明的阴影效果。
这是最后实现的效果,我专门挑了几个在刘海部分模型非常接近的头发,仅有贴图差异较大,可以看到左边一个,它的半透过渡比较柔和,所以它的阴影也就会淡一些。而右边的实体区域比较多,所以阴影比较锐利。 对于正常投影难以表达的微小部件,或者程序化生成的模型,我们会调整bias,以达到强化阴影的效果。 穿搭组合的自由度:在基础骨架上编辑人物的碰撞体配置 第二个重要的点是穿搭组合的自由度,也是换装游戏可玩性的支持。由于暖暖系列中衣服版型设计多种多样。我们的绑定设计分为基础骨架和扩展骨架两个部分。
基础骨架确定以后,可以在其基础上编辑人物的碰撞体配置,而扩展骨架则需要设置其物理参数。两部分数据合在一起,在运行时,由物理系统计算其动态效率。
由于移动平台性能有限,暖暖系列衣服复杂度又比较高,即使是PC平台也无法完全使用布料系统来做到我们想要的效果。我们的物理系统是一个链式迭代的质点系统,粒子之间可以添加弹簧,用这种方式可以做到简单的布料模拟。 如何进行碰撞处理? 关于碰撞处理,粒子和弹簧都可以作为碰撞处理对象。我们的碰撞体有两类,第一类由跟随基础骨架,包括平面碰撞体和胶囊碰撞体。胶囊碰撞体可以调整两端的大小,让它更贴合人的形体。 在处理腿与裙子的碰撞时,当腿的移动范围较小的时候,能够正确往外推裙子。而腿移动量较大时,腿反而会向内压裙子。我们的解决方法是用弹簧方向和粒子链方向的叉乘向量,作为弹簧的碰撞主方向,当弹簧与胶囊体发生碰撞时,优先朝主方向那一侧推。这样效果更为稳定。
第二类碰撞体跟随扩展骨架,根据服装的骨骼链和邻居结构可以构建出虚拟的网格碰撞体。这个蓝色的点是当前的物理粒子,线是物理骨骼链和邻居结构。我们可以将其转换成黄色所示的虚拟网格。在运行时,可以查找粒子所最接近的虚拟网格中的三角形,用这个三角形作为平面碰撞。我们使用八叉树管理网格碰撞体中的所有三角形,方便运行时快速查找。网格碰撞体的三角形比较大,过渡比较剧烈,在某些情况下可能会抖动,我们允许在运行时动态取最近的四个三角形,根据距离权重插值进行平滑处理。 网格碰撞体的另一个作用是可以处理部件间的碰撞,我们为每类部件可以取一个别名,粒子设置它与哪个别名进行碰撞。如图我们设置头发与“裙子”进行碰撞,接下来我们切裙子的时候,只要通过别名,就可以动态寻找到当前所穿的究竟是哪个裙子,这个裙子针对的网格碰撞体是怎样的,可以实时调整头发与网格碰撞体的碰撞。
(编辑:顺游网_765游戏网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |










浙公网安备 33038102330581号