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

esc*_*ter 0 unity-game-engine

我有一个正在制作原型的资源包,它使用一些高质量的 tga 纹理(分辨率为 2048x2048)。其中有 250 个,这意味着我的 Asset 文件夹非常大。我知道对于某些渲染情况,.tga 比 .png 更好,但对于我的用例,可移植性比纹理质量更重要。

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

纹理全部用于使用标准着色器的材质,并且用于反照率、金属、法线贴图或遮挡字段。没有我需要更新参考的奇怪的自定义着色器。

有没有一种自动化的方法来做到这一点?

ben*_*blo 5

IMO,最简单的方法是就地替换文件,保留 .meta 文件,这样指南就不会改变。这样,您甚至不需要更新材质引用,而这在 Unity 中始终是一件痛苦的事情。

步骤:

  1. 将 TGA 批量转换为 PNG(Unity 关闭或至少未聚焦)
  2. 删除所有 TGA,但不删除关联的 .tga.meta 文件
  3. 将所有 .tga.meta 文件重命名为 .png.meta
  4. 然后重新打开/重新聚焦 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
Run Code Online (Sandbox Code Playgroud)

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

for f in *.tga; do magick ./"$f" ./"${f%.tga}.png"; done;
Run Code Online (Sandbox Code Playgroud)

要清理 .tga:

rm *.tga
Run Code Online (Sandbox Code Playgroud)