如何使用 DirectXTex 将 dx10 dds 图像转换为 png

how to convert dx10 dds image to png using DirectXTex

我一直在使用 DirectXTex 工具,想知道是否可以反向使用 texconv.exe,转换 DDS -> TGA(或其他支持的格式)而不是 TGA, BMP, PNG -> DDS。 将 PNG 图像转换为 DDS 可以像这样完成:

texconv -f <DXGI_FORMAT> source.png

我正在寻找这样的东西:

texconv source.dds output.png

或者有什么办法可以做到吗?

DirectXTex 库当然可以将 DDS 转换为另一种图像格式,如 PNG。请记住,DDS 文件格式能够对所有可能的 Direct3D 资源类型进行编码,DXGI_FORMAT,但 PNG 不能。

如果本例中的 source.dds 是单个图像(即没有 mipmap、没有数组、没有立方体贴图、不是体积贴图)并且 source.dds 的格式是 [= PNGsupported WIC pixel formats 之一的 65=],那么这有效:

texconv source.dds -ft png

如果它被编码为 DX10 扩展 header,它可能不是 PNG 编解码器支持的等效 WIC 像素格式,因此您需要提供转换格式。类似于:

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,它支持 multi-image as:

texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM

I realized that the current behavior of the WIC writer to default to using multi-frame encoding is inconsistent with the behavior of the TGA and HDR writers which always write the first image. I added new behavior in this commit so that the WIC writer also defaults to writing just the first image unless you use -wicmulti. This will be in the next binary release, but currently you need to sync the master branch and build it yourself to get this new behavior.

With the new version, to get a multiframe write you'd use texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM -wicmulti. If you just want the first image, you can use texconv source.dds -ft png -f R8G8B8A8_UNORM. This also removes the need to explicitly use -m 1 in the case where you just want the first image written.

在处理立方体贴图时,可以利用texassemble工具将其转换为条形或十字单图:

texassemble h-strip source.dds -o output.png -f R8G8B8A8_UNORM

如果 source.dds 是使用 DXGI_FORMAT_*_SRGB 格式编写的,那么当它写入 PNG 时,它将对 sRGB 块进行编码以指示色彩空间。这可能会或可能不会导致预期的外观。您可以将其显式转换为 non-SRGB 格式(如上所示),您可以使用 -f R8G8B8A8_UNORM_SRGB 将其保留在 sRGB 色彩空间中,或者您可以使用 -srgbi-srgbo 切换到 'cast' 它 to/from sRGB 格式而不更改数据。

如果 source.dds 是 High-Dynamic 范围纹理(即 R32G32B32A32_FLOAT 等),则生成的图像可能 blown-out 将其转换为 R8G8B8A8_UNORM.在这种情况下,您可以使用 -tonemap 开关。

See Texconv and Texassemble for more details.