#0 

18-06-2008 18:11:16

Sakamakak
Membre
Date d'inscription: 28-05-2008
Messages: 18

Bonjour a tous,

J'explique mon problème : j'ai une scène ou je désire modifier à l'exécution (en fonction d'événements clavier) la texture de ISceneNodes.
L'idée est de leur appliquer une texture de couleur différente pour indiquer si ils sont sélectionné par l'utilisateur ou pas (ça ça n'est pas très compliqué)

Lors du rendu, le changement dynamique de texture est réalisé très aléatoirement, certains mesh prennent en compte ce changement et d'autres pas. Cependant, avec quelques mouvements de caméra on arrive à voir mes mesh qui se mettent à "clignoter" en switchant d'une texture à l'autre très rapidement. Donc, on se rend bien compte que les textures ont été appliquées. Ce que j'ai pu en plus vérifier avec un petit debug du type :

Code:

 printf("Texture braunchLeft 0 : %s\n", monIsceneNode->getMaterial(0).getTexture(0)->getName());

Donc je ne comprend pas pourquoi ce changement n'est pas prit en compte.
Petite remarque :  Cela marchait très bien avant, jusqu'à il y a quelque temps. :p
J'ai ajouté des animations (pas des animation irrlicht de base, des animations faites maison) sur ces ISceneNodes, et je soupçonne que c'est depuis cela que ça ne fonctionne plus. Mais je n'ai aucune idée de comment résoudre le problème. J'ai parcourus beaucoup de forum et aucune solution.

Je ne suis pas un expert Irrlicht et encore moins un expert 3D. Une idée pour forcer ou rafraichir l'affichage de mes textures ?
Ça vient des animations ? du mesh ? du rendu ? d'un rafraichissement que je ne fais pas ?
Je ne sais pas vraiment.

Merci par avance, d'essayer de m'apporter un peu d'aide

Hors ligne


#1 

18-06-2008 21:46:18

wizad
Abonné
Lieu: Caen
Date d'inscription: 30-09-2006
Messages: 106

Essaye de modifié la ligne 112 ça doit être elle qui pose problème

[Dsl pour les modos]
Le Code Bordel!!!
Et un peu plus qu'une ligne si tu veux qu'on t'aide

Hors ligne


#2 

19-06-2008 09:37:37

Sakamakak
Membre
Date d'inscription: 28-05-2008
Messages: 18

wizad :

[Dsl pour les modos]
Le Code Bordel!!!
Et un peu plus qu'une ligne si tu veux qu'on t'aide


Tu as raison, j'aurais du fournir le code. Autant pour moi, mais ça n'est pas la peine d'être agressif. big_smile

Bref en farfouillant et en faisant varier mes Materials, j'ai résolu mon problème.
Le problème reste encore totalement obscur pour moi, mais j'en explique ma compréhension :

Code:

//creation d'un AnimatedMeshSceneNode a partir d'un mesh (non animé) créé sous blender
IAnimatedMeshSceneNode *braunchNode = this->sceneManager->addAnimatedMeshSceneNode(this->braunch3DModel,parent,-1,
                                                                                braunchNodePosition,
                                                                                core::vector3df(0.,0.,0.),
                                                                                core::vector3df(1.,1.,1.),false);

//chargement de la texture initiale
ITexture* braunchTexture = this->videoManager->getTexture(resources::braunchTexture);
if(!braunchTexture)
{
    new Exception("Failed to load the \"braunch texture\". Please verify the path");
}
braunchNode->setMaterialTexture(0,this->braunchTextureModel);
braunchNode->setMaterialType(EMT_SOLID);
...

Premièrement il semblerait que si on créé un MeshSceneNode au lieu d'un IAnimatedMeshSceneNode on ne puisse pas changer de texture dynamiquement (j'ai dit "IL SEMBLERAIT", mais si ca peut se confirmer, c'est bon a savoir)

Je charge mes textures qui viennent se "plaquer" à l'exécution de la sorte (rien de bien sorcier) :

Code:

...

//chargement de la texture de remplacement
irr::video::ITexture* braunchTexture = this->videoManager->getTexture("resources/TexturesDatas/braunchTexture.jpg");
if(!braunchTexture)
{
    new Exception("Failed to load the \"Braunch texture\". Please verify the path");
}
...

A l'exécution, je switche d'une texture à l'autre en fonction de divers évènements. Pour changer de texture voici ce que je fais :

Code:

...
braunchNode->setMaterialTexture(0, this->braunchTexture);
        this->nodes[fatherNodeId]->braunchRightRepresentation->setMaterialTexture(0, this->braunchTexture);
...

Deuxièmement j'utilisais un Material de type EMT_TRANSPARENT_ALPHA_CHANNEL et ca ne fonctionné pas.  Maintenant j'utilise un Material EMT_SOLID et tout va bien. Mais c'est quand même super contraignant.

Et enfin (le plus agaçant je pense), cette combinaison ne permet de faire du changement de texture à l'exécution uniquement avec le driver OPENGL et pas avec DIRECT3D9.
Je me pose la question de savoir si tout ca ne vient pas de mon mesh en fait. Je reste sans réponse.

Hors ligne


#3 

19-06-2008 09:44:52

hardcpp
Abonné
Date d'inscription: 26-04-2008
Messages: 229

quele bordel ton code

Hors ligne


#4 

19-06-2008 10:02:14

Sakamakak
Membre
Date d'inscription: 28-05-2008
Messages: 18

Les lignes que j'ai fourni sont réparties en plusieurs classes et factorys car ma scène est générée a partir d'une description XML.
Donc ça risque d'être un peu difficile de fournir 35 classes sur le forum.

Hors ligne


#5 

19-06-2008 10:55:26

wizad
Abonné
Lieu: Caen
Date d'inscription: 30-09-2006
Messages: 106

@Sakamakak : j'étais pas réellement agressif. C'était plus pour marquer les esprits. (je regarde tout à l'heure).

Hors ligne


#6 

19-06-2008 11:16:32

Sakamakak
Membre
Date d'inscription: 28-05-2008
Messages: 18

Pas de problème, je te remercie d'essayer de m'aider big_smile

Hors ligne


#7 

19-06-2008 13:38:32

wizad
Abonné
Lieu: Caen
Date d'inscription: 30-09-2006
Messages: 106

En fait vu le comportement que tu décris je privilégierais un problème au niveau de ta boucle principale (par exemple une réinitialisation avec la texture initiale puis un rechangement en fonction des modifs) ce qui pourrais provoqué un clignotement.

Dernière modification par wizad (23-06-2008 21:02:56)

Hors ligne


#8 

19-06-2008 13:48:52

Sakamakak
Membre
Date d'inscription: 28-05-2008
Messages: 18

wizad :

An fait vu le comportement que tu décris je privilirais un problème au niveau de ta boucle principale (par exemple une réinitialisation avec la texture initiale puis un rechangement en fonction des modifs) ce qui pourrais provoqué un clignotement.


Pas bête, mais après quelques tests, je pu vérifier que ça ne venait pas de ma boucle principale.
D'ailleurs si c'était ça pourquoi en passant d'un material EMT_TRANSPARENT a un EMT_SOLID, comme je l'ai fait ça marcherait ? La texture est bien appliquée et est bien prise en compte au bon moment, c'est lors de l'affichage du rendu qu'il se passe des choses étranges. :p

Hors ligne


#9 

23-06-2008 17:22:36

WarShattrith
Membre
Date d'inscription: 24-09-2007
Messages: 10

Pourrais-tu fournir un screen ?

Es-tu sûr par ailleurs que tu ne superpose pas deux objets aux mêmes coordonnées ? (Ca peut faire glitcher et clignoter un peu la texture).


Config : Intel Core 2 Quad Q6600 @ 2.7 GHz | 2Go de RAM DDR2 | GeForce 7600GT | Asus P5K
Chef de projet/Développeur principal Ouverta

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
93 invités en ligne
Aucun membre connecté
RSS Feed