我一直在使用 DirectXTex 工具,想知道是否可以使用texconv.exe
向后转换DDS -> TGA
(或其他支持的格式)而不是TGA, BMP, PNG -> DDS
. 将 PNG 图像转换为 DDS 可以这样完成:
texconv -f <DXGI_FORMAT> source.png
我正在寻找这样的东西:
texconv source.dds output.png
或者有什么可以做到的吗?
DirectXTex库当然可以将 a 转换为DDS
另一种图像格式,例如PNG
. 请记住,DDS
文件格式能够对所有可能的 Direct3D 资源类型进行编码DXGI_FORMAT
,但PNG
不是。
如果source.dds
在这种情况下 是单个图像(即没有 mipmap、没有数组、没有立方体贴图、不是体积贴图)并且 的格式source.dds
是 DXGI 等效的一种受支持的 WIC 像素格式,PNG
那么这可以工作:
texconv source.dds -ft png
如果它被编码为DX10
扩展标头,则可能不是编解码器支持的 WIC 像素格式等价物PNG
,因此您需要提供转换格式。就像是:
texconv source.dds -ft png -f R8G8B8A8_UNORM
如果source.dds
有 mipmap,那么可以通过使用以下方法轻松删除它们:
texconv source.dds -m 1 -ft png -f R8G8B8A8_UNORM
如果source.dds
是立方体贴图或纹理数组,则问题是png
无法编码多个图像。您可以将其写为支持多图像的 TIFF:
texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM
我意识到 WIC 写入器当前默认使用多帧编码的行为与始终写入第一张图像的 TGA 和 HDR 写入器的行为不一致。我在此提交中添加了新行为,因此 WIC 编写器也默认只编写第一个图像,除非您使用
-wicmulti
. 这将在下一个二进制版本中发布,但目前您需要同步主分支并自己构建它以获得这种新行为。在新版本中,要获得多帧写入,您可以使用
texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM -wicmulti
. 如果你只想要第一张图片,你可以使用texconv source.dds -ft png -f R8G8B8A8_UNORM
. 这也消除了-m 1
在您只想写入第一个图像的情况下显式使用的需要。
在处理立方体贴图时,您可以使用该texassemble
工具将其转换为条形或交叉单图像:
texassemble h-strip source.dds -o output.png -f R8G8B8A8_UNORM
如果source.dds
是使用DXGI_FORMAT_*_SRGB
格式编写的,那么当它写入 a 时PNG
,它将对 sRGB 块进行编码以指示颜色空间。这可能会或可能不会导致预期的外观。您可以将其显式转换为非 SRGB 格式(这将在上面发生),您可以使用 将其保留在 sRGB 颜色空间中-f R8G8B8A8_UNORM_SRGB
,或者您可以使用-srgbi
或-srgbo
开关将其“转换”为/从 sRGB 格式转换改变数据。
如果source.dds
是高动态范围纹理(即R32G32B32A32_FLOAT
等),则生成的图像可能会被炸毁,将其转换为R8G8B8A8_UNORM
. 在这种情况下,您可以使用-tonemap
开关。
有关详细信息,请参阅Texconv和Texassemble。