我一直在使用DirectXTex工具,并且想知道是否可以向后使用texconv.exe
来转换DDS -> TGA
(或其他支持的格式)而不是TGA, BMP, PNG -> DDS
。
要将PNG图像转换为DDS,可以这样做:
texconv -f <DXGI_FORMAT> source.png
我正在寻找类似的东西:
texconv source.dds output.png
或者有什么能够做到的吗?
答案 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 commit和Texconv。