我有一个正在制作原型的资源包,它使用一些高质量的 tga 纹理(分辨率为 2048x2048)。其中有 250 个,这意味着我的 Asset 文件夹非常大。我知道对于某些渲染情况,.tga 比 .png 更好,但对于我的用例,可移植性比纹理质量更重要。
我想将所有这些 .tga 转换为 .png,然后更新所有材质引用以使用新的 .png。删除旧的 .tga 完全没问题 - 我不需要保留它们。我知道如何轻松批量转换图像;我只想更新 .mat 文件中的引用以使用新纹理。
纹理全部用于使用标准着色器的材质,并且用于反照率、金属、法线贴图或遮挡字段。没有我需要更新参考的奇怪的自定义着色器。
有没有一种自动化的方法来做到这一点?
IMO,最简单的方法是就地替换文件,保留 .meta 文件,这样指南就不会改变。这样,您甚至不需要更新材质引用,而这在 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)