0

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

texconv -f <DXGI_FORMAT> source.png

我正在寻找这样的东西:

texconv source.dds output.png

或者有什么可以做到的吗?

4

1 回答 1

4

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开关。

有关详细信息,请参阅TexconvTexassemble

于 2017-02-26T19:41:43.377 回答