IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

DirectX Discussion :

Affichage étrange sous directGraphic


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut Affichage étrange sous directGraphic
    Bonjour à tous,

    J'ai un léger problème. Je viens d'implémenter des classes gérant DirectGraphics en 2D. Je travaille sous VC++. Je me suis inspiré (grandement) d'un tutorial qui fournissait un projet VC++.

    Mon problème est qu'à la place de l'affichage d'un sprite dans ma fenêtre (je travaille en mode fenêtré) j'ai une fenetre noire avec une forme rouge qui part de toute la longueur du bord gauche et qui descend en diagonal bas en ligne droite avec un dégradé de rouge vers le noir.

    Je me suis dit que je m'étais trompé quelque part. Mais j'ai analysé mon prog et le prog que j'avais pris comme modèle en utilisant le débugage pas à pas. J'ai l'impression que l'appelle des fonctions est tout le temps identique et que les paramètres sont les mêmes (exactement les mêmes format de chargemet de texture, exactement les mêmes paramètres de créations d'objet DirectX, exactement les mêmes vertex...).

    J'ai changé les coordonnées de lecture dans la texture et d'écriture dans l'écran, cela ne change absoluement rien. Si j'enlève la procédure d'affichage du sprite la fenêtre reste bien noire. Si je change de source pour le sprite la forme est la même et seule la couleur de départ change (bleu à la place de rouge).

    Quelqu'un a une explication ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce serait possible de voir un bout de code siouplé ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Ok ... Je voulais pas en arriver là ... Parce que mon code est divisé dans toutes mes classes. Je vous passer la classe fenêtre. Je ne pense pas avoir de problème la dedans, vu que j'ai effectivement ma fenêtre et qu'il y a bien quelque chose d'affiché dessus. Bon, voici l'initialisation de ma classe moteur2D je ne vous montre que celle du mode fenêtré (sinon il va y avoir trop de code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
     
    	/**     @: initialise les objets directX et prépare une fenêtre windows
                    @retour: 0 si aucune erreur, un code d'erreur sinon 
                    @note: ne pas lancer cette fonction avant de faire quoi que ce soit entraine une levé d'exception
            */
    bool YC_M2D_Moteur2D::initialiser(YC_M2D_Fenetre& fenetre, int freqRaffraichissement)
    {
    	//sauvegarde des paramètres
    	iFreqAffichage = freqRaffraichissement;
    	fFenetre = &fenetre;
     
    	//création du device D3D
    	if (dxGenerateur==NULL)	dxGenerateur = Direct3DCreate8(D3D_SDK_VERSION);
     
    	//initialisation de l'objet D3DPRESENT_PARAMETERS
    	ZeroMemory(&dxParam,sizeof(dxParam));
     
    	//selon le mode désiré, on lance la fonction adéquate
    	if (fenetre.accPleinEcran())
    		{if(!initD3DPleinEcran()) return false;}	// gestion d'erreur
    	else
    		{if(!initD3DFenetre()) return false;}		// gestion d'erreur
     
     
    	//paramètres définissant les matrices de visualisation et d'affichage
    	D3DXMatrixOrthoLH(&dxOrthogonal, (float)fenetre.accLargeur(), (float)fenetre.accHauteur(), 0.0f, 1.0f);
    	D3DXMatrixIdentity(&dxIdentite);
    	dx3D->SetTransform(D3DTS_PROJECTION, &dxOrthogonal);
    	dx3D->SetTransform(D3DTS_WORLD, &dxIdentite);
    	dx3D->SetTransform(D3DTS_VIEW, &dxIdentite);
     
    	//paramètres d'affichage pour l'utilisation de la clé de couleur et de la transparence
    	dx3D->SetRenderState(D3DRS_ALPHATESTENABLE, true);
    	dx3D->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_NOTEQUAL);
    	dx3D->SetRenderState(D3DRS_ALPHAREF, 0x00);
    	dx3D->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    	dx3D->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
    	dx3D->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
    	dx3D->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
    	dx3D->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
    	dx3D->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
    	//filtrage bilinéaire pour un effet d'antialiasing lors des distorsions des sprites
    	dx3D->SetTextureStageState(0,D3DTSS_MAGFILTER,D3DTEXF_LINEAR);
    	dx3D->SetTextureStageState(0,D3DTSS_MINFILTER,D3DTEXF_LINEAR);
    	//désactivation de la lumière (sinon les sprites seront noirs)
    	dx3D->SetRenderState(D3DRS_LIGHTING, FALSE);
     
    	//on obtient un pointeur sur la surface du BackBuffer
    	dx3D->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&dxSurfaceTampon);
     
    	// indique que la classe a été initialisé
    	modInitialise();
    	return true;
    }
     
    /** @: charge la partie plein écran du moteur 2D */
    inline bool YC_M2D_Moteur2D::initD3DFenetre()
    {
    	//définit le format d'affichage
    	D3DDISPLAYMODE formatAffichage;
    	if(dxGenerateur->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &formatAffichage) != D3D_OK)
    		return false;
     
    	//paramètres définissant le rendu
    	dxParam.Windowed = TRUE;
    	dxParam.BackBufferFormat = formatAffichage.Format;
    	dxParam.BackBufferWidth = fFenetre->accLargeur();
    	dxParam.BackBufferHeight = fFenetre->accHauteur();
    	dxParam.EnableAutoDepthStencil = FALSE;
    	dxParam.SwapEffect = D3DSWAPEFFECT_COPY;
    	formatAffichage.RefreshRate=iFreqAffichage; //approximatif, ne sert pas vraiment
     
    	//création du device DirectGraphics
    	if(dxGenerateur->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, fFenetre->accGestionnaire(),
    							D3DCREATE_HARDWARE_VERTEXPROCESSING,
    							&dxParam, &dx3D ) != D3D_OK)
    		return false;
     
    	ShowCursor(fFenetre->accCurseurVisible()); //curseur visible par dessus la fenêtre
    	return true;
    }
    Quelques explications. YC_M2D_Fenetre est ma classe définissant ma fenetre. accLargeur et accHauteur sont des accesseurs (d'où le acc ...) à la largeur et hauteur de la fenêtre.

    Voici la partie début et fin de création de rendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /** @: indique le début d'un nouveau rendu (dessin) */
    inline void YC_M2D_Moteur2D::debutDessin()
    {
    	doitEtreInitialise();
    	//début de la phase de rendu : on efface l'écran, et on spécifie le début du rendu
    	dx3D->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
    	dx3D->BeginScene();
    }
    /** @: indique la fin d'un nouveau rendu (dessin) et demande son affichage */
    inline void YC_M2D_Moteur2D::finDessin()
    {
    	doitEtreInitialise();
    	//fin du rendu et affichage à l'écran
    	dx3D->EndScene();
    	HRESULT hr;
    	hr=dx3D->Present( NULL, NULL, NULL, NULL );
     
    	if ((fFenetre->accPleinEcran())&&(hr==D3DERR_DEVICELOST)) 
    		dx3D->Reset(&dxParam);
     
    }
    Maintenent le code de chargement de texture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    /** @: permet de charger la texture (ne pas l'appeler, utilisé par YCI_CHARGEABLE, appeler plutôt charger() ) 
            @retour: vrai si le chargement s'est bien déroulé */
    bool YC_M2D_Texture::chargerProcedure()
    {
    	YC_LeverException_F((YCP_M2D_Moteur2D::accMoteurActuel()==NULL),YC_ERR_OBJET_NON_INITIALISE,"Erreur : tentative de chargement sans YC_M2D_Moteur défini comme le moteur actuel");
    	char* chaine = sChemin.copieChaine();
    	//si un format est spécifié, on crée la texture avec ce format
    	if (fFormat != D3DFMT_UNKNOWN)
    	{
    		D3DXCreateTextureFromFileEx(	YCP_M2D_Moteur2D::accMoteurActuel()->accDevice(), sChemin.accChaine(),
    										(uint)fLargeur, (uint)fHauteur, 1, D3DUSAGE_RENDERTARGET,
    										fFormat, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    										0xFF000000, NULL, NULL, &dxTexture);
    	}
    	//si la texture est un fichier TGA, on la charge en 32 bits
    	else if (strcmp(strlwr(chaine+strlen(chaine)-3),"tga")==0)
    	{
    		//essai de chargement en 32 bits A8R8G8B8
    		D3DXCreateTextureFromFileEx(	YCP_M2D_Moteur2D::accMoteurActuel()->accDevice(), sChemin.accChaine(),
    										(uint)fLargeur, (uint)fHauteur, 1, D3DUSAGE_RENDERTARGET,
    										D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    										0xFF000000, NULL, NULL, &dxTexture);
    		fFormat = D3DFMT_A8R8G8B8;
    	}
    	//essai de chargement en 32 bits A8R8G8B8
    	else if	(SUCCEEDED(D3DXCreateTextureFromFileEx(	YCP_M2D_Moteur2D::accMoteurActuel()->accDevice(), sChemin.accChaine(),
    												(uint)fLargeur, (uint)fHauteur, 1, D3DUSAGE_RENDERTARGET,
    												D3DFMT_A1R5G5B5, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    												0xFF000000, NULL, NULL, &dxTexture)))
    	{ fFormat = D3DFMT_A1R5G5B5; }
     
     
    	//essai de chargement en 16 bits A1R5G5B5
    	else if (SUCCEEDED(D3DXCreateTextureFromFileEx(	YCP_M2D_Moteur2D::accMoteurActuel()->accDevice(), sChemin.accChaine(),
    													(uint)fLargeur, (uint)fHauteur, 1, D3DUSAGE_RENDERTARGET,
    													D3DFMT_A4R4G4B4, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    													0xFF000000, NULL, NULL, &dxTexture)))
    	{ fFormat = D3DFMT_A4R4G4B4; }
    	//essai de chargement en 16 bits A4R4G4B4
    	else if (SUCCEEDED(D3DXCreateTextureFromFileEx(	YCP_M2D_Moteur2D::accMoteurActuel()->accDevice(), sChemin.accChaine(),
    													(uint)fLargeur, (uint)fHauteur, 1, D3DUSAGE_RENDERTARGET,
    													D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_DEFAULT,
    													0xFF000000, NULL, NULL, &dxTexture)))
    	{ fFormat = D3DFMT_A8R8G8B8; }
    	else			
    	{ delete[] chaine;
    		YC_LeverException_F(true,YC_ERR_FORMAT_NON_GERE,"Erreur : impossible de charger la texture, chemin introuvable ou format de fichier non géré."); }
     
    	//infos sur la texture
    	D3DSURFACE_DESC Infos;
    	dxTexture->GetLevelDesc(0,&Infos);
     
    	//obtention de la surface associée à la texture (afin de pouvoir rendre plus tard sur la texture)
    	dxTexture->GetSurfaceLevel(0, &dxSurface);
     
    	//on a accès ainsi à Infos.Size, Infos.Width, Infos.Height
    	fTaille=(float)Infos.Size;
    	fLargeur=(float)Infos.Width;
    	fHauteur=(float)Infos.Height;
    	delete[] chaine;
    	return true;
    }
    Voila maintenant le code d'affichage d'une texture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /** @: affiche une texture comme indiqué
            @param: texture la texture à afficher
            @param: rec le rectangle vertex paramètrant la copie */
    void YC_M2D_Moteur2D::afficher(YCP_M2D_Texture& texture,const YC_M2D_RectangleVertex& rec)const
    {
    	dx3D->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
    	dx3D->SetTexture(0, texture.accTexture());
    	dx3D->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, rec,sizeof(YC_M2D_RectangleVertex));
    }
    Toutes les fonctions commencant par un acc sont des accesseurs.

    J'espère que ca pourra vous aider.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Alors quelques remarques :

    - D3DUSAGE_RENDERTARGET : à enlever, il ne faut l'utiliser que si tu fais du rendu sur texture, ce qui n'a pas l'air d'être le cas.

    - Le format de tes textures : attention certains ne sont pas supportés par les cartes 3D, prend toujours soit A8R8G8B8, R5G6B5 ou DXT* si tu veux compresser. Pour un usage normal de texture c'est ce qu'on prend habituellement.

    - D3DPT_TRIANGLEFAN : à mon avis c'est ça qui coince, il faudrait voir la partie du code qui crée les vertices.

    - DrawPrimitiveUP : MAUVAIS !! Utilise des vertex buffers ! DrawPrimitiveUP est infiniment lent tu perds en performance, et c'est aussi une mauvaise habitude dont il vaut mieux se débarasser.

    Voilou !

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Pour D3DUSAGE_RENDERTARGET : En effet pour l'instant je ne le fais pas, mais je le ferais surement par la suite (effet de pluie, et distortion ...)

    pour ce qui est du format, merci du conseil. Mais ca n'explique pas mon erreur, vu que le prog modèle utilise les mm formats mais marche.

    Pour D3DPT_TRIANGLEFAN, même chose qu'au dessus. L'autre prog les utilise et ca marche (d'ailleurs ca marchait moi aussi jusqu'à un certain moment...). Les vertices ne sont pas en cause (enfin si j'ai bien compris que vertice est la traduction de vertex) vu que j'ai, lors de l'affichage, la meme vertice que dans le prog modèle:
    [1]
    x = -320.500
    y = 240.500
    z = 1.00
    u = 0.00
    v = 0.00
    color = 4294967295
    [2]
    x = 319.500
    y = 240.500
    z = 1.000
    u = 1.000
    v = 0.0000
    color = 4294967295
    [3]
    x = 319.500
    y = -239.500
    z = 1.000
    u = 1.000
    v = 1.000
    color = 4294967295
    [4]
    x = -320.500
    y = -239.500
    z = 1.000
    u = 0.000
    v = 1.000
    color = 4294967295

    Par exemple.

    Pour ce qui est des vertex buffers ... il va falloir que je me replonge dans la doc (grumph ... ésotérique) ... Mais je prends note =)

    Merci déjà des infos

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ok alors encore quelques conseils :

    - Utilise toujours des triangles strips, jamais des fans, sauf si t'as vraiment une geometrie en forme de pyramide. Ensuite utilise aussi des index buffers, ça peut etre plus pratique que les strips (mais là dans ton cas un strip c'est ok).

    - Vertices c'est le pluriel de vertex, quant à la traduction c'est "sommet"

    - "color = 4294967295". Utilise donc une macro, ce sera plus explicite ! Par exemple D3DCOLOR_RGBA(r, g, b, a) (me souviens pu de la syntaxe mais c'est un truc du genre)

    Et enfin pour ton problème le mieux ce serait que tu postes un screenshot, c'est assez vague pour l'instant.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Hum ... pour le screen shot on verra plus tard. Je continuais à programmer d'autres aspects de mon interface et maintenant plus rien ne s'affiche =b (c'est ça le progrès ! ). Enfin bref. J'ai noté tout tes conseils. Je suis en train de travailler sur les index buffers et ca risque de me prendre du temps. Comme je risque de changer tout mon interface, mon problème se résoudra sûrement tout seul. Merci pour toute ton aide !

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Si ça intéresse qq'un j'ai trouvé l'erreur. Cela vient du size of dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       dx3D->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, rec,sizeof(YC_M2D_RectangleVertex));
    En fait le YC_M2D_RectangleVertex est défini comme un tableau de 4 élément contenant la structure définissant un point. Et sizeof() me renvoyait 4 au lieu de 4*sizeof(Type_des_points).

    Ouala.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage étrange sous 2 PC avec IE9
    Par DjSteph dans le forum Internet
    Réponses: 0
    Dernier message: 24/04/2013, 16h14
  2. Pb d'affichage de sous formulaire
    Par Didi17 dans le forum Access
    Réponses: 7
    Dernier message: 28/10/2005, 03h48
  3. [crystal report 8.5] Pb d'affichage de sous états
    Par abdel6908 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 06/06/2005, 10h42
  4. Affichage parasite sous Firefox
    Par Steph4fun dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/02/2005, 15h05
  5. Affichage graphique sous forme de tableau.
    Par eulone dans le forum C++
    Réponses: 2
    Dernier message: 24/11/2004, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo