游戏角色皮肤要做流动特效,如果使用顶点uv对效果贴图进行采样,存在以下几个问题:
- 因为在展UV的时候,各个结构之间基本都是拆开的,流动效果会有明显的接缝问题,破坏了效果的完整性
- 同样因为展UV的原因,无法保证各个部位的流动方向一致
具体效果如下:
所以,效果图采样不能使用顶点UV,可以考虑使用顶点的世界坐标或自身坐标。
如果使用世界坐标,那么就会出现角色在移动过程中,对特效流动效果产生影响,这要看具体影响程度。如果使用自身坐标,需要设置一个偏移量,因为大部分角色的模型左右对称,如果不做一个偏移并且效果贴图不是四方连续的情况下,还是会有一条中缝。
之后就是面对下一个问题:如何将3维的世界坐标/自身坐标,转换成2维的uv坐标?
可以参考网上流传的解决方案——三向贴图(Tri-planar mapping)
该方式存在以下几个问题:
- 一张贴图三次采样,成本过高
- 因为最后是根据法线权重对三次采样进行叠加处理,所以,可能会有相对明显的拉伸和叠加效果,效果很不理想。如图
-------------------------------修正内容:晚上做梦的时候梦到还在调试这个三向贴图效果,法线是算法有问题,白天醒来仔细想想,理论上确实不应该出现拉丝效果。再三查证后发现上述第二点效果有误,图中出现的拉丝效果是因为使用了自身坐标+世界法线造成的。全部修改到世界坐标系或自身坐标系以后,效果如下图:
-----------------------------修正内容 End
最后,经过尝试,探索出一种理论上不够严谨,但是计算量小,效果还可以接受的方案。先上图:
方案比较简单:
real2 uv = offset + real2(i.localPos.x + i.localPos.z / 2, i.localPos.y + i.localPos.z / 2);
具体参数可以根据自己的效果进行调整,而且这个方案应该还有很大的优化空间,仅供大家参考一下解决思路。