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

时间:2017-02-26 11:12:04

标签: directx textures dxgi

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

texconv -f <DXGI_FORMAT> source.png

我正在寻找类似的东西:

texconv source.dds output.png

或者有什么能够做到的吗?

1 个答案:

答案 0 :(得分:3)

DirectXTex库当然可以将DDS转换为另一种图片格式,例如PNG。请记住,DDS文件格式能够编码每种可能的Direct3D资源类型和DXGI_FORMAT,但PNG不是。

如果在这种情况下source.dds是单个图像(即没有mipmap,没有数组,没有立方体贴图,没有体积图),source.dds的格式是DXGI等效于其中一个PNG用于texconv source.dds -ft png ,然后就可以了:

DX10

可能如果它被编码为PNG扩展标头,则它不是texconv source.dds -ft png -f R8G8B8A8_UNORM 编解码器所支持的WIC像素格式,因此您需要提供转换格式。类似的东西:

source.dds

如果texconv source.dds -m 1 -ft png -f R8G8B8A8_UNORM 有mipmap,那么可以使用以下内容轻松删除这些内容:

source.dds

如果png是立方体贴图或纹理数组,则问题是texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM 无法对多个图像进行编码。您可以将其写为TIFF,它支持多图像:

-wicmulti
  

我意识到WIC编写器默认使用多帧编码的当前行为与始终写入第一个图像的TGA和HDR编写器的行为不一致。我在supported WIC pixel formats中添加了新行为,这样WIC编写器也默认只编写第一个图像,除非您使用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是使用PNG格式编写的,那么当它写入-f R8G8B8A8_UNORM_SRGB时,它将对sRGB块进行编码以指示颜色空间。这可能会也可能不会导致预期的外观。您可以将其显式转换为非SRGB格式(上面将会发生这种情况),您可以使用-srgbi将其保留在sRGB色彩空间中,也可以使用-srgbo或{{1切换到&#39; cast&#39;它在不改变数据的情况下进出sRGB格式。

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

  

有关详细信息,请参阅this commitTexconv

相关问题