Direct3D et arguments de CreateTexture

Comme le dit si bien le titre du post, j’ai un petit problème avec CreateTexture…
Mon problème est : quand je veux créer une texture de 640x272, CreateTexture me retourne INVALIDCALL alors que si j’en créé une de 256x256, ça marche…
On sait qu’une texture est toujours gérée en puissance de 2 pour la taille, mais en théorie, si on passe en argument à CreateTexture des tailles n’étant pas des puissances de 2, il serait plutot censé se débrouiller non (dites moi si je me plante) ?
Le problème vient-il vraiment de la taille “non conforme” de ma texture ?

je peux pas trop te repondre pour D3D, mais je suis en plein ds un projet openGL, et les textures doivent etre en taille des puissances de 2 sinon le programme plante. Toujours en openGL mais en SmallTalk, le programme refuse purement et simplement de se lancer, c’est seulement en mettant du 256256 ou 512512 que ca marchait (bref du 2 puissance…).

Edit : bref je pense que ca doit etre qqch comme un standard, cette histoire de taille.
Ce message a été édité par EvilGuinness le 23/06/2003

Oui, ça c’est clair qu’en interne, il est obligatoire d’avoir la texture en puissance de 2, mais je pensais (et je pense encore) que Direct3D pouvait quand même faire la conversion lui même… Je me souviens que sous OpenGL, je passais des textures de taille exotique, et ça marchait…
La question est donc en fait : faut-il alors, par sécurité, gérer tout nous même en puissance de 2 ? (genre je fais un joli GFX en 640x272, et il faut que je le redimensionne moi même en 256x256 ou 512x256 pour que ça marche). Ca ne dégrade pas trop l’image de faire ça ?

[quote]Oui, ça c’est clair qu’en interne, il est obligatoire d’avoir la texture en puissance de 2, mais je pensais (et je pense encore) que Direct3D pouvait quand même faire la conversion lui même… Je me souviens que sous OpenGL, je passais des textures de taille exotique, et ça marchait…

La question est donc en fait : faut-il alors, par sécurité, gérer tout nous même en puissance de 2 ? (genre je fais un joli GFX en 640x272, et il faut que je le redimensionne moi même en 256x256 ou 512x256 pour que ça marche). Ca ne dégrade pas trop l’image de faire ça ?[/quote]ca marchait sous openGL avec des tailles “exotiques”? Je n’ai jamais reussi a faire marcher une texture qui n’etait pas en puissances de 2…je programme avec les librairies mesa sous linux, et pourtant c’est pas faute d’essais! Si tu as une astuce…
Pour les conversions automatiques, j’ai eu le temps de voir comment les images et les textures etaient traitees, c’est un sacre bazar plein de matrices --> j’ai vite abandonne l’idee! Bon je cause tjs en OpenGL, desole

Pour le redimensionnement, j’ai utilise the gimp et ca m’a tout fait impecc, sans degradation visible tout du moins.
Edit : tant que ce n’est pas un agrandissement tout du moins…sinon, au pire, mipmapping power.
Ce message a été édité par EvilGuinness le 23/06/2003

Tiens, je me suis plante, et il m’a meme pas fallu deux minutes pour le trouver
Extrait de programmationworld.com :

“Les cartes 3D imposent parfois des limites très contraignantes quant aux dimensions des textures qu’elles peuvent stocker. Certaines acceptent de remplir toute leur mémoire avec une seule texture, (ex : des textures de 4096 par 4096 pixels en 32 bits pour les cartes embarquant 64mo de mémoire) tandis que d’autres, comme les voodoos, n’accepteront que des textures de 256 par 256 pixels. Certaines cartes imposent même le fait que les textures soient carrées (largeur et hauteur identiques) et/ou que ces valeurs soient des puissances de deux. Le cas le plus fréquemment rencontré n’impose pas de limite de taille (dans les limites de la mémoire que la carte comporte) mais demande que les dimensions des textures soient des puissances de deux. DirectX comporte des méthodes qui, à partir d’une image ayant n’importe quelles dimensions, vont créer des textures ayant une taille acceptable par le matériel. Cependant, il est bien plus efficace de prévoir cette éventualité lors de la création des textures, et de leur donner des dimensions correctes dès le départ. De même, plus vos textures ont des dimensions importantes, plus cela consomme des ressources, il convient donc d’éviter de travailler avec des textures énormes.”

Je pense que ca repond a peu pres a la question!

Oui, ça me conforte dans l’idée de devoir me débrouiller moi même pour donner la bonne taille à mes textures dès le début.

Pour en revenir aux tailles exotiques sous OpenGL, ça marchait avec moi, ça dépend peut-être du pilote utilisé. Mais disons que question compatibilité, vaut mieux prévoir le coup…

oui, comme le dis l’article de EvilGuinness, en d3d, ca depent des cartes…
pour l’opengl, c’est puissance de 2 ou la mort
et de toute facons, meme si la carte prends les formats “exotique”, genre rectangle pas puissance de 2, je le deconseille, car ca peut souvent couter tres tres tres cher en performance…

et si l’artiste te fait des textures de bases bizarres (genre 1257 * 12 en 24 bit), tu le gifles et tu rescales

l’autre truc qu’il faut te rappeler, c’est que vu que les coordonees de textures sont indique entre 0.0f et 1.0f pour 0 -> taille de ta texture, tu peux changer la taille au chargement : pour avoir des grandes quand tu a beaucoup de memoire dispo, et utilise des petites quand tu tournes sur un hardware plus modeste.

voila !

[quote]et si l’artiste te fait des textures de bases bizarres (genre 1257 * 12 en 24 bit), tu le gifles et tu rescales[/quote]Ce qui est bien c’est qu’on peut remplacer artiste par PM (celui qui fait les specs), chef, testeur, VP, Senior VP, CEO… bon ca devient risque de gifler la… ou meme d’ouvrir sa bouche mais dans le concept j’adore !