研究缘起

在实际项目制作中,经常要对场景中的美术资产进行检查,其中贴图像素密度是重要的一项。但由于在实际制作中每个模型都会有不同程度的UV浪费或复用,因此很难单纯用贴图大小与模型大小来判断实际的贴图像素密度。

现在的研究有给引擎直接添加一个显示模型贴图密度的View State的方法。这种方法会很直观,但问题在于其要对九引擎进行改动,过于繁琐不方便。同时对于一个材质有多张贴图的模型来说,难以对每张贴图进行直观的显示。

因此,我要做的是使用UE提供的功能,制作一个可以在引擎内对场景内的模型包含的所有贴图进行像素密度计算的工具。

相关技术研究

Geometry Script插件介绍

Geometry Script是一个UE5时代出现的官方插件,可用于使用蓝图程序化生成网格体等操作。

Geometry Script官方文档 | 使用Geometry Script制作工具

在使用前要先开启并重启。

Geometry Script插件

模型表面积和模型UV面积

使用动态网格体的Get Mesh UV Size Info方法即可,由于需要考虑缩放,因此要使用Copy Mesh From Component节点,并勾选Transform To World。

获取UV Size

现在需要测一下这个UV Size节点给出的Mesh Area和UV Area是什么意思:

形状 Scale Mesh Area UV Area
正方体 1 6w 6
正方体 3 54w 6
面片 1 1w 1
1 3.12w 0.9375
圆柱 1 4.70w 2.55

可以看出这个UV Area就是UV在模型上的复用度,因此用Mesh Area除以UV Area就是一个UV在实际场景中占的面积。该数据可以用于测场景中单位面积下的UV密集程度,进而得到贴图像素密集度,很有用。

这里可以将其除以10000,把单位从平方厘米转换为平方米:

计算出一个UV的面积

计算贴图密度

对于一般的需求来说,需要的都是贴图在场景中的像素密度。因此可以通过以下方式计算得出对应贴图分辨率的像素密度。

1024分辨率贴图的像素密度

模型多材质处理

对于有多个材质的模型,可以逐个材质使用Get Triangles by Material ID进行计算:

对于多个材质的处理

材质多贴图处理

对于同一个材质中有多张贴图的情况,对材质实例与材质进行分开处理,最终得到Texture2D对象,并使用GetSize方法计算贴图像素密度:

对于多个贴图的处理

有测试发现,在部分UE版本中,若贴图的大小还受Texture Group影响,可能会导致GetSize方法的返回值不对。

工具制作使用

需求设计

根据上述技术研究,可以实现的功能:

  • 对场景中的模型进行批量扫描,并按需加入限制(如只扫描固定路径或前后辍的模型资产);
  • 对特定贴图进行限制扫描,如不扫描法线贴图等;
  • 输入可接受的贴图乐像素密度范围,扫描出在此范围外的;
  • 将结果以Json输出,以方便传输;