Unity UV/2UV相关的一系列坑

Author Avatar
Kanglai Qian 11月 15, 2015

昨天和美术折腾了一天,好好的理解了一下Unity里UV/2UV的设置,主要是理解很多程序的概念在美术上的理解是怎么一回事儿…

1UV:光滑组

之前和美术交流的时候,所说的MAX光滑组我一直不能很好的理解。后来某一天自己在翻MAX教程的时候,突然想通了:在MAX这种工具里,除非手动炸开顶点,不然始终应该是同一个顶点数据;当导出模型的时候,如果是保持一个光滑组,那么顶点数据就保持一份;如果是多个光滑组,那么这个顶点就会被复制多份,不同的面使用了不同的顶点。

这也是为什么从美术有这样的几个概念:

  • 一般来说,导出应该是保证一个光滑组(之前写过maxscript帮美术批量解决这个问题);
  • 同一个光滑组里是“软边”,不同光滑组是“硬边”(前面一种情况里,顶点的法线是几个面的平均;后面情况中是一个顶点保存为多个数据,有不同的法向量),说的其实就是相邻面的颜色是否突变;
  • Max里有个工具,可以根据一个角度阈值划分光滑组,其实就是如果两个面的夹角在某个阈值以下,则共用顶点,否则炸开成两个位置相同、法向量不同的顶点;
  • 有人跟我讲Maya里也是若干角度阈值区分出软边、硬边、很硬的边(什么鬼…)之类的概念,我没细看但是应该也是相同的。

光滑组理解之后,就可以理解Unity导入模型的几个设置了

unity_import_mesh

主要是Normals这个选项:如果选用Import,表示直接读取模型文件里的数据,包括光滑组信息和法线(有时候美术可能人肉压法线,达到一些特殊效果),此时Smoothing Angle是无效的;如果是Calculate就表示重新计算法线,这里有一个特别坑的地方就是根据Smoothing Angle,引擎会重新计算“光滑组”,而且是在MAX导出的基础上,也就是说就算美术导出的模型是只有一个光滑组,在这里的设置也可能导致其某些顶点分裂。

ps. 做描边效果的时候,必须保证美术导出的模型是没有分裂顶点,同时Unity也没有分裂(Smoothing Angle拉到180即可),不然背面膨胀的时候就有产生缝隙。

unity_import_mesh

2UV:如何有效自动分割

2UV基本上就是用来配合光照贴图使用,据说3A游戏的模型都是人肉做的,但我们人力不足就只能靠自动算法了…这里主要想吐槽的是,不同参数导致分割出来的2UV效果差很多,区别可见下两图:如果拆分出来的2uv连在一起,那么烘焙出来的的就是“软边”,否则是硬边…

默认参数的效果,可以看到有几块侧面被分到外面了

lightmap_2uv_old

改大Angle Error的效果,可以看到一个相对比较理想的结果,侧面围绕底面一圈

lightmap_2uv_new

批量改了之后,烘焙出来的一些奇怪的硬边(下图右)就消失啦~

lightmap_2uv_compare

ps. 在Lighting面板里,还有所谓的Preserve UVs和Auto UV几个选项,这个应该是Enlighten对2UV的再次加工(不管是来自模型还是引擎自动分的2UV),不过这里我就没有细看了…