Directx render

Signaler
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010
-
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008
-
Salut a tous.
Voila j'ai fais deux fonctions qui affichent un triangle et une meshe.
quand j'affiche la meshe tout va bien,quand j'affiche le triangle ok aussi.
Mais quand j'affiche les deux en meme temps voila ce qui ce passe.


J'ai mis un timer a une demi seconde pour voir ce qui ce passe.


Le premier affichage tout est ok mais apres une demi seconde(le re affichage) le triangle prend la couleur de la meshe(mais garde sa texture).


J'ai du me loupé quelque part ,peut etre a la lumiere.
Merci de m'aider.

11 réponses

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Bah oui, tu t'as loupé, mais où ? Sans code, on ne peut pas dire grand chose.

Passe le code executé entre BeginScene et EndScene.



"le triangle prend la couleur de la meshe(mais garde sa texture)."

Qu'est ce que ça veut dire ? Détaille le format de point utilisé.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Salut.
Le code pour afficher un triangle et une meshe je l'ai pris du sdk dirext9.
la meshe c'est un arbre avec des feuilles vertes,apres 1/2seconde la texture du triangle vire au vert mais on vois toujour les motifs.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Tu veux dire que la texture des feuilles remplace celle du triangle,
parce que je ne sais pas si tes feuilles sont vertes car texturées
vertes ou avec des points verts.



Admettons que la texture des feuilles remplace celle du triangle (dans
ce cas ta phrase est très embrouillante, le "MAIS garde la texture" du
moins).

Ca veut dire que tu n'indiques pas à DirectX d'utiliser la texture du triangle pour afficher le triangle.



Refais SetTexture(0, texturetriangle) juste avant d'afficher le
triangle et à chaque rendu, car la fonction de directX modifie la
texture du slot 0 pour mettre celle de la texture verte avant
l'affichage des feuilles.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Salut.


Imagine le triangle affiche un ciel nuageux bleu apres 1/2sec on le voit toujour comme si eclairé avec une lumiere verte(comme les feuilles de la meshe).


Dans mon timer pour la mesh j'utilise une boucle comme dans le sdk:
g_pd3dDevice->SetMaterial( &g_pMeshMaterials[Id] );
g_pd3dDevice->SetTexture( 0, g_pMeshT[Id]);
g_pMesh->DrawSubset( j );

pour le triangle:
g_pd3dDevice->SetTexture( 0, g_pTexture);
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Le code ne contient pas d'erreur mais il manque trop de lignes pour que je puisse trouver l'erreur.

Comment gère-tu l'éclairage ?

Eclaires-tu les feuilles avec une lumière verte que tu ne désactives pas pour afficher le triangle ?



Si on voit toujours les motifs du ciel sur le triangle, c'est que tu as
une lumière verte. Même si ton format de point contient une couleur,
elle n'a pas pu être modifiée d'un rendu à l'autre, de plus tu écrases
la texture verte de la feuille du slot 0?



Balance des screenshots et plus de code.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

Re salut.
Non j'eclaire avec une lumiere blanche.

Premier affichage: triangle puis meshe.

Puis 1/2 sec apres (le re affichage):triangle pluis meshe.
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

,
Messages postés
295
Date d'inscription
dimanche 4 mai 2003
Statut
Membre
Dernière intervention
6 décembre 2010

ce donne:
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
J'ai l'impression que tu as essayé d'envoyé un truc qui n'est pas passé sur le forum (du moins que je ne vois pas).

Sinon, si tu n'as qu'une lumière blanche, je ne vois vraiment pas d'où peut venir le problème.

Passe le code executé entre BeginScene et EndScene, c'est desormais la seule solution pour t'aider. Ou mieux, upload un zip et donne le lien pour qu'on puisse compiler ton code pour le tester et le debugger.
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

ton probleme ca vient de ca : g_pd3dDevice->SetMaterial( &g_pMeshMaterials[Id] );

comme tu affiches le triangle en premier lors du premier rendu ca n'a pas d'incidence sur son rendu mais lros du 2ieme rendu et toujours programmé pour éffectuer le rendu avec le material de l'arbre qu'il applique également au triangle!
Pour regler le probleme tu dois affecter un nouveau material pour le triangle.

g_pd3dDevice->SetMaterial( &g_pMeshMaterials[Id] );
g_pd3dDevice->SetTexture( 0, g_pMeshT[Id]);
g_pMesh->DrawSubset( j );

pour le triangle:
g_pd3dDevice->SetMaterial( &triangleMaterial); // ici insère un nouveau material pour le triangle sinon il garde celui de l'arbre.
g_pd3dDevice->SetTexture( 0, g_pTexture);
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(Vertex) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );

Voilà je pense que ca devrait regler ton probleme, du moins je l'espere car c'est vrai sans complément de sources on peut difficilement t'aider...
@++
Messages postés
71
Date d'inscription
mercredi 29 septembre 2004
Statut
Membre
Dernière intervention
19 mars 2008

Je vais rajouter ici comment tu peux créer un material adéquat rapidement.

donc pour ton triangle si tu veux qu'il soit éclairé normalement... tu peux faire :



const D3DMATERIAL9 *mat;


ZeroMemory(&mat,
sizeof(mat));


(D3DXCOLOR&)mat->Diffuse = D3DXCOLOR(...... //la couleur ke tu veux; ici blanc serrait approprié dans ton cas je pense.... pour diffuse, ambient.....enfin tout
(D3DXCOLOR&)mat->Ambient = D3DXCOLOR(......


...........

J'espere que ca t'aidera un peu...
P.S: pas obligé d'utiliser un pointeur.... c comme tu le sents.