2017-02-26 5 views
0

J'ai travaillé avec les outils DirectXTex et je me demandais s'il est possible d'utiliser texconv.exe en arrière, pour convertir DDS -> TGA (ou autre format pris en charge) au lieu de TGA, BMP, PNG -> DDS. Pour convertir l'image PNG DDS peut être fait comme ceci:comment convertir image dx10 dds en png en utilisant DirectXTex

texconv -f <DXGI_FORMAT> source.png 

Je cherche quelque chose comme ceci:

texconv source.dds output.png 

Ou est-il quelque chose capable de le faire?

Répondre

1

La bibliothèque DirectXTex peut certainement convertir un DDS en un autre format d'image tel que PNG. Rappelez-vous que le format de fichier DDS est capable d'encoder tous les types de ressources possibles de Direct3D et DXGI_FORMAT, mais pas le PNG.

Si le source.dds dans ce cas est une seule image (pas de mipmaps, pas de tableaux, pas de cartes de cube, pas de carte de volume) et le format du source.dds est un DXGI équivalent d'un des supported WIC pixel formats pour PNG, alors cela fonctionne:

texconv source.dds -ft png 

probable si elle est codé comme un en-tête étendu DX10, ce n'est pas un format de pixel WIC équivalent qui est pris en charge par le codec PNG, vous devez fournir un format de conversion. Quelque chose comme:

texconv source.dds -ft png -f R8G8B8A8_UNORM 

Si source.dds a mipmaps, alors ceux-ci peuvent facilement être dépouillé en utilisant:

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

Si le source.dds est un cubemap ou un tableau de textures, le problème est que png peut » t encoder plusieurs images. Vous pouvez l'obtenir à écrire en tant que TIFF qui prend en charge multi-image:

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

J'ai réalisé que le comportement actuel de l'écrivain WIC par défaut à l'aide du codage multi-images est incompatible avec le comportement de les écrivains TGA et HDR qui écrivent toujours la première image. J'ai ajouté un nouveau comportement dans this commit de sorte que l'écrivain WIC par défaut écrit également uniquement la première image, sauf si vous utilisez -wicmulti. Ce sera dans la prochaine version binaire, mais actuellement vous devez synchroniser la branche maître et la construire vous-même pour obtenir ce nouveau comportement.

Avec la nouvelle version, pour obtenir une écriture multitrame, vous utiliseriez texconv source.dds -m 1 -ft tif -f R8G8B8A8_UNORM -wicmulti. Si vous voulez juste la première image, vous pouvez utiliser texconv source.dds -ft png -f R8G8B8A8_UNORM. Cela supprime également la nécessité d'utiliser explicitement -m 1 dans le cas où vous voulez juste la première image écrite.

Lorsque vous traitez avec cubemaps, vous pouvez utiliser l'outil texassemble pour le convertir en une bande ou une croix seule image:

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

Si le source.dds est écrit en utilisant un format DXGI_FORMAT_*_SRGB, puis quand il écrit un PNG il va encoder le morceau sRGB pour indiquer l'espace de couleurs.Cela pourrait ou non entraîner l'apparence attendue. Vous pouvez le convertir explicitement en format non-SRGB (ce qui arrivera ci-dessus), vous pouvez le conserver dans l'espace colorimétrique sRGB en utilisant -f R8G8B8A8_UNORM_SRGB, ou vous pouvez utiliser les commutateurs -srgbi ou -srgbo pour le 'lancer' vers/depuis un format sRGB sans changer les données.

Si source.dds est une texture High-Dynamic Range (à savoir R32G32B32A32_FLOAT ou similaire), l'image résultante peut se volatiliser-out convertir en R8G8B8A8_UNORM. Vous pouvez utiliser le commutateur -tonemap dans ce cas.

Voir Texconv et Texassemble pour plus de détails.

+0

Merci pour votre réponse. Vous avez fait erreur dans le premier exemple, vous avez écrit "=" au lieu de "-" :) En passant, existe-t-il un moyen de définir le nom de sortie (png) ou/& path? –

+0

Merci. Correction de la faute de frappe. J'ai utilisé le même design pour DirectXTex '' texconv'' que l'outil original SDK hérité de DirectX qui est vraiment pour 'la conversion en bloc'. Vous pouvez utiliser '' -o'' pour fournir un répertoire de sortie, '' -sx'' pour ajouter un suffixe de nom de fichier, et/ou '' -px'' pour ajouter un préfixe de nom de fichier. –

+0

Juste découvert, pourquoi les chemins contenant des espaces ne fonctionnent pas? Comme le répertoire "Mes fichiers" est considéré comme "Mes" "Fichiers" –