Conversion de texture : alternative à nvtt?

Conversion de texture : alternative à nvtt? - C++ - Programmation

Marsh Posté le 07-09-2013 à 16:41:07    

Bonjour à tous,
 
Je cherche à convertir en code des images de types variés (.bmp, .png, .jpeg, .dds etc), en textures DDS mipmappées dont le format peut être compressé (DXT1/3/5) ou non (L8, RGBA8, RGBA16F, B10G10R10A2 etc.) selon les réglages souhaités.*
J'utilise devIL pour convertir les images disque au format L8/RGB8/RGBA8, et je pensais utiliser nvtt pour la conversion en texture.
Manque de bol, nvtt ne supporte que le RGBA8 comme format non DXT! :(
Dans les équivalents à nvtt qui en supportent nettement plus, j'ai seulement trouvé 2 exe: AMD Compressonator, et texconv dans le SDK DirectX...ça me fait un peu chi** de ne pas pouvoir utiliser de libs/include, et aussi de perdre les settings qualité/gamma/normal map bien pratiques proposés par nvtt.
Quelqu'un sait s'il existe une autre lib du genre, ou a des astuces pour moi?  
 
Merci d'avance!
 
 
* La raison étant que DirectX 11 a besoin d'une chaine complète de mipmaps pour créer une texture immutable, et que je ne veux pas contraindre un graphiste à convertir lui-même une image => perte de temps pour lui, et perte d'espace disque si un .png doit être remplacé par un .dds non compressé avec ses mipmaps.


Message édité par akalash47 le 07-09-2013 à 18:59:16
Reply

Marsh Posté le 07-09-2013 à 16:41:07   

Reply

Marsh Posté le 07-09-2013 à 17:03:52    

Pourquoi tu ne te sers pas du plugin DDS de Photoshop ?
 
Si tu veux absolument faire ça en coding, dans ce cas tu peux tenter de zieuter le code source de NVTT pour coder toi-même la compression, sinon sur openGL tu peux utiliser glCompressTexImage2D (il me semble que c'est cette fonction) qui accepte plusieurs type comme le S3TC, il me semble que de toute façon les format comme le L8 sont pas compressés, et après t'as plus qu'à récup ta texture compressée (ça devrait être possible).
Glut te permet aussi de générer des mip-map, gluBuildMipMap il me semble, maintenant si tu veux absolument DirectX, je sais pas :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 07-09-2013 à 17:13:42    

Non je crois que tu n'y es pas, relis :)
Pour faire simple, imagine que mon programme prend en entrée une image PNG, 1 composante. Et qu'au moment où je la charge avec DirectX11 (ID3D11Device::CreateTexture2D), les data associées doivent être au format DXGI_FORMAT_R8_UINT avec toutes les mipmaps. Quelle lib et quelles fonctions je peux utiliser?

 

* Je ne vais pas m'amuser à recoder NVTT, surtout s'il faut refaire la partie optimisée en CUDA lol.
* C'est vrai que je pourrais utiliser DirectX pour faire la conversion de format (OpenGL j'ai rien vu pour compresser en DXT par contre), mais c'est beaucoup de code pour y arriver et c'est certainement beaucoup moins rapide que nvtt.
* Bien sûr un graphiste peut utiliser le plugin Photoshop ou le texture tool de DirectX pour générer la texture, mais l'idée est de lui éviter de le faire (ne serait-ce que pour gagner en espace disque). D'autre part le format de la texture finale peut encore avoir besoin de varier (imagine une texture que le graphiste aurait défini en R32F, selon la qualité désirée le programme pourrait décider de compresser en R16F, nvtt ne le permet pas).


Message édité par akalash47 le 07-09-2013 à 19:47:13
Reply

Marsh Posté le 07-09-2013 à 20:24:55    

Ben tu fais ton chargement de ton image (libpng), tu lui balance que le canal red, et ensuite t'as des fonctions pour générer les mip-maps.
 
Je connais pas DirecTX, mais premier résultat sur google :
 
http://msdn.microsoft.com/en-us/li [...] s.85).aspx
 
DX 9.0, mais ça m'étonnerait que ça ait été enlevé sur DX11.
 
OpenGL te propose la compression S3TC, c'est le DXT :D
 
Mais vaut mieux que la compression se fasse hors chargement, parce que générer les mipmaps / compresser ça prend tu temps.
Tu n'éviteras pas cette phase aux graphistes :D


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 07-09-2013 à 20:39:08    

Tu te fous de moi là? T'as lu ce que j'ai écrit, t'as pris le temps de te renseigner?
Ca fait 5 ans que je bosse avec DirectX 9 et OpenGL, je sais comment générer des mipmaps avec, merci! Justement avec DX11 c'est pas possible de faire de génération automatique pour des textures immutable.
 
----------------------------------------------------------------------------------
Perhaps you don't deserve to answer a topic when you don't understand it

Reply

Marsh Posté le 07-09-2013 à 23:46:07    

Pas besoin de devenir désagréable et agressif hein :sarcastic:
 
Moi ce que j'ai compris de ton problème, c'est que tu cherches à écrire un truc pour compresser en s3tc des images au format png / bmp et co pour éviter que ce soit aux artistes de le faire.
Je connaissais pas les textures immutable, et ton edit à ce sujet sur ton premier poste date d'après mon message, bref.
 
Si j'ai bien pigé, les textures immutables c'est juste qu'elle ne peuvent plus être modifiés après la création, dans ce cas tu peux toujours faire ta compression et ensuite écrire les données compressées dans ta texture immutable.
 
Mais toujours est-il que je ne te recommanderait pas ça, convertir au format DDS c'est pas tellement long, et tu gagnes énormément en temps de chargement à les pré-convertir :jap:


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-09-2013 à 00:07:03    

Désolé de m'être emporté. Mais j'ai vraiment eu l'impression que tu me prenais pour un noob de la prog 3D, alors que j'ai pas mal de bouteille et ce problème me prend la tête depuis 2 jours :P
 
En plus je viens de découvrir qu'à l'install du SDK DirectX, maintenant il y a une dll appelée TxView.dll qui te permet de faire clic droit sur un fichier image : "Propriétés -> Convert to file format..." et là t'as plein d'options d'export. Encore mieux que le plugin Photoshop! Mais ça m'horripile de ne pas trouver de fonction dans le SDK qui fait la même chose que ce plug...elle doit bien être fourrée dans cette dll!

Reply

Marsh Posté le 08-09-2013 à 00:44:09    

:jap: désolé que tu l'aies pris comme ça, c'était pas voulu :D
 
C'est vrai que c'est bizarre de pas trouver de trucs dans le SDK pour faire la compression..
Perso ce que je ferais (si c'est possible, mais un mélange DX/GL me paraît un peu sale), c'est de faire la conversion des images au format voulu avec le glCompress + build MipMap (un exemple ici : http://titania-x3d.googlecode.com/ [...] ssion.pdf) et ensuite de transférer tout ça à ta texture DirectX.
 
Je jetterais un coups d’œil à TxView, c'est vrai que c'est cool de pas avoir à démarrer Photoshop à chaque fois qu'on a besoin de convertir une texture :D  
 


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-09-2013 à 11:27:24    

Le lien ne marche pas. Et glCompressedTex2D ne fait pas de compression en DXTC, il charge simplement des données déjà compressées dans une texture.
 
Sur le forum DirectX on m'a indiqué la lib DirectXTex, elle est pas mal du tout. Mais ça confirme ce que je pensais, si quelqu'un s'est amusé à la faire c'est qu'a priori ni MS, ni nvidia, AMD, Khronos...n'ont fourni de lib de conversion générique. Ca me parait incroyable!

Reply

Marsh Posté le 08-09-2013 à 12:58:55    

Effectivement, la parenthèse s'est incrustée dans l'url :sweat:
 
Le code pour compresser / récupérer les octets de ta texture compressée :  
 

Code :
  1. glBindTexture(GL_TEXTURE_2D, compressed_decal_map);
  2. glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_ARB, width, height,
  3. 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);
  4. glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &compressed);
  5. /* if the compression has been successful */
  6. if (compressed == GL_TRUE)
  7. {
  8. glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT,
  9. &internalformat);
  10. glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB,
  11. &compressed_size);
  12. img = (unsigned char *)malloc(compressed_size * sizeof(unsigned char));
  13. glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, img);
  14. SaveTexture(width, height, compressed_size, img, internalFormat, 0);


 
Mais bon, apparemment y'a pas tellement de contrôle au final, pis si t'as trouvé mieux ça sert à rien :o
 
Le S3TC est un algo propriétaire, c'est peut être pour ça qu'il n'y a pas grand chose sur la compression en soi (il me semble que tu as l'algo + ou - détaillé, mais pas de source 'officielles'), d'ailleurs je me demande pour le dds si on a le droit de s'en servir comme on veut..


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed