在 Unity 中,我想将一些纹理从.tga批量转换为.png并更新引用



我有一个资源包,我正在使用一些高质量的tga纹理,尺寸为2048x2048。其中有 250 个,这意味着我的资产文件夹很大。我知道对于某些渲染情况,.tga比.png更好,但对于我的用例,可移植性比纹理质量更重要。

我想将所有这些.tga转换为.png,然后更新所有材料引用以使用新的 .png。删除旧.tga完全没问题 - 我不需要保留它们。我知道如何轻松批量转换图像;我只想更新 .mat 文件中的引用以使用新纹理。

这些纹理都用于使用标准着色器的材质中,并用于反照率、金属、法线贴图或遮挡字段。我不需要更新引用的奇怪自定义着色器。

有没有自动化的方法可以做到这一点?

最简单的方法是就地替换文件,保留 .meta 文件,这样 guid 就不会改变。这样,您甚至不需要更新材质引用,这在 Unity 中总是很痛苦。

程序:

  1. 将 TGA 批量转换为 PNG(Unity 已关闭或至少未聚焦)
  2. 删除
  3. 所有 TGA,但不删除关联的 .tga.meta 文件
  4. 将所有 .tga.meta 文件重命名为 .png.meta
  5. 然后重新打开/重新聚焦 Unity,让它重新导入:您应该一切就绪。Unity 认为纹理是相同的,只需要重新导入。它甚至会保留导入设置。

您可以使用简单的批处理或 shell 脚本自动重命名(步骤 3)。如果项目受源代码管理,请使用 CVS 的命令行重命名界面来保留纹理的历史记录。如果不是,那么显然您可以制作项目的备份副本。

作为旁注:

我知道对于某些渲染情况,.tga比.png

这不是真的。当 Unity 导入纹理时,它会将它们转换为特定于 GPU/平台的格式(这在库中),纹理的原始格式没有区别。

对于我的用例,便携性比纹理质量更重要。

PNG 具有无损压缩选项,因此您可以同时拥有更小的尺寸和像素完美的质量,与 TGA 相比没有缺点(除了由于解压缩,导入时间可能会稍长)。

从@escapecharacter编辑: 这非常有效。这是我所做工作的文档。仅供参考,我在Windows上使用bash。我的项目在版本控制中被跟踪,所以我对重大更改并不谨慎。从我的纹理目录:

要转换 .meta 文件:

for i in *.tga.meta; do git mv $i ${i/.tga.meta/.png.meta}; done

为了将.tga转换为.png,我使用了通过choco安装的ImageMagick:

for f in *.tga; do magick ./"$f" ./"${f%.tga}.png"; done;

要清理.tga,请执行以下操作:

rm *.tga

最新更新