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 :

Integration de directx 9 dans les MFC


Sujet :

DirectX

  1. #1
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut Integration de directx 9 dans les MFC
    Bonjour je reprends un sujet sur ce forum car il concerne aussi bien les MFC que directx:
    J'aurais voulu inclure directx dans un programme utilisant les MFC. J'ai récuperé le code d'une application Win32 fonctionnelle avec une classe DirectX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class DirectX
    {
    public:
    DirectX();
    ~DirectX();
    LPDIRECT3D9 d3d;
    LPDIRECT3DDEVICE9 device;
    D3DPRESENT_PARAMETERS d3dpp;
    int init(HWND hWnd);
    void adjust(int largeur, int hauteur);
    };
    voila les fonctions:
    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
    int DirectX::init(HWND hWnd)
    {
    D3DDISPLAYMODE d3ddm;
    D3DDEVTYPE devtype;
    D3DCAPS9 caps;
    d3d=Direct3DCreate9(D3D_SDK_VERSION);
    if(!d3d)
     return 0;
    if(d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)<0)
     return 0;
    ZeroMemory(&d3dpp,sizeof(d3dpp));
    d3dpp.Windowed=TRUE;
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    d3dpp.EnableAutoDepthStencil=TRUE;
    d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
    d3dpp.BackBufferFormat=d3ddm.Format;
    if(d3d->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)<0)
    {
    MessageBox(hWnd,"Pas de device HAL, le programme fonctionnnera,
    mais lentement","Attention",MB_OK|MB_ICONWARNING|MB_SETFOREGROUND);
     
    devtype=D3DDEVTYPE_REF;
    }
    else
    {
    devtype=D3DDEVTYPE_HAL;
    }
    if (d3d->CreateDevice(D3DADAPTER_DEFAULT,devtype,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&device)<0)
    return 0;
    return 1;
    }
    void DirectX::adjust(int largeur, int hauteur)
    {
    D3DXMATRIX proj;
    d3dpp.BackBufferWidth=largeur;
    d3dpp.BackBufferHeight=hauteur;
    device->Reset(&d3dpp);
    device->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
    device->SetRenderState(D3DRS_AMBIENT,0xffffff);
    D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI/4,((float largeur)/hauteur,1.0f,500.0f);
    device->SetTransform(D3DTS_PROJECTION,&proj);
    }
    Seulement mystère une erreur se génère au niveau de la fonction adjust:
    Pourquoi? Init est bien appelé et largeur et hauteur ne sont pas nulles.
    Quelqu'un saurait-il comment m'aider?

    L' erreur généré à l'execution est:Exception non gérée à 0x00a510ff dans DirectxApp.exe : 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000000.

    raphchar

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    la création du device a du foirer, testes ta valeur de retour pour voir

  3. #3
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (d3d->CreateDevice(D3DADAPTER_DEFAULT,devtype,hWnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&device)<0)
    return 0;
    Pas d'erreur ici ni avant.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    non mais est ce que tu la testes cette valeur de retour quand tu appelles ta fonction init, parce que ton erreur est claire : tu as un pointeur null.

  5. #5
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Ca donne:
    d3d 0x...
    ->IUnknown {...}
    ->__vfptr 0x...
    [0] 0x...
    [1] 0x...
    [2] 0x00000000

    Ah la device les [0] [1] et [2] : impossible d'evaluer l'expression:

    C'est comment que je peux corriger cette erreur???

  6. #6
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Est-ce que le HWND de la fenêtre est valable ?
    Cela peut dépendre de cela.
    Regarde dans le SDK de Direct X il y a des exemples d'utilisation de MFC + Direct X

  7. #7
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Apparament oui j'utlise
    GetSafeHwnd() comme je l'ai vu ailleurs.

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Essayer avec CDialog::m_Hwnd sinon quel type de projet ? SDI,MDI ou Dialog Based ?

  9. #9
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Merci, mais le resultat est strictement le même en utilisant m_hWnd
    J'utilise du SDI.

  10. #10
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Je crois que j'ai trouvé

    j'ai mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CWnd *pWnd = AfxGetMainWnd();
     
    if (pWnd == NULL)
    {
    AfxMessageBox(_T("Erreur fatale"));
    }
    dans le constructeur: et c'est bien null.

    Il faut que je vérifie cette condition jusqu'à ce qu'elle soit valide.

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Citation Envoyé par raphchar Voir le message
    dans le constructeur: et c'est bien null.

    Il faut que je vérifie cette condition jusqu'à ce qu'elle soit valide.
    aaarfff ...c'était tout bête j'ai déjà eu ce problème

  12. #12
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    C'est justement parce que jai trouvé un forum ou cette erreur était citée que j'ai su...

  13. #13
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Je dois reprendre le problème car rien n'est résolu je ne sais pas pourquoi le fond d'écran s'affiche mais j'ai rajouté la classe Graphisme et plouf:
    plus rien le pire c'est que le programme ne bloque même pas en mode release lorsqu'il est lancé ex Visual studio. Mais en lançant le débugger je me suis rendu compte que le devise est NULL, je poste ma classe Graphisme et le reste sachant que la fonction render n'a pas changée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #define TXVERTEXFORMAT (D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE2(0))
    #define LVERTEXFORMAT  (D3DFVF_XYZ|D3DFVF_DIFFUSE)
     
    struct texturevertex
    {
    	D3DXVECTOR3 pos;
    	float u;
    	float v;
    };
    struct linienvertex
    {
    	D3DXVECTOR3 pos;
    	D3DCOLOR color;
    };
    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
    class Graphisme
    {
    private:
    	LPDIRECT3DVERTEXBUFFER9 dreickbuf;
    	LPDIRECT3DVERTEXBUFFER9 linienbuf;
    	LPDIRECT3DTEXTURE9 texture;
    	D3DMATERIAL9 material;
    	LPDIRECT3DDEVICE9 device;
    public:
    	Graphisme();
    	~Graphisme();
    	void create(LPDIRECT3DDEVICE9 dev,char *texturefile);
    	void setup();
    	void render();
    }
    ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Graphisme::create(LPDIRECT3DDEVICE9 dev,char *texturefile)
    {
    	device=dev;
    	device->CreateVertexBuffer(6*sizeof(texturevertex),0,TXVERTEXFORMAT,D3DPOOL_MANAGED,&dreickbuf,NULL);
    	device->CreateVertexBuffer(6*sizeof(linienvertex),0,LVERTEXFORMAT,D3DPOOL_MANAGED,&linienbuf,NULL);
    	D3DXCreateTextureFromFile(device,texturefile,&texture);
    	ZeroMemory(&material,sizeof(material));
    	material.Ambient=D3DXCOLOR(1,1,1,0);
    }
    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
    void Graphisme::setup()
    {
    	texturevertex *dv;
    	dreickbuf->Lock(0,0,(void**)&dv,0);
    	dv[0].pos=D3DXVECTOR3(0,0,0);
    	dv[1].pos=D3DXVECTOR3(2,1,0);
    	dv[2].pos=D3DXVECTOR3(2,0,0);
    	dv[3].pos=D3DXVECTOR3(2,0,0);
    	dv[4].pos=D3DXVECTOR3(3,2,0);
    	dv[5].pos=D3DXVECTOR3(4,0,0);
    	dv[0].u=0.2f;
    	dv[0].v=0.1f;
    	dv[1].u=0.8f;
    	dv[1].v=0.1f;
    	dv[2].u=0.5f;
    	dv[2].v=0.6f;
    	dv[3].u=0.0f;
    	dv[3].v=1.0f;
    	dv[4].u=0.5f;
    	dv[4].v=0.0f;
    	dv[5].u=1.0f;
    	dv[5].v=1.0f;
    	dreickbuf->Unlock();
    	linienvertex *lv;
    	linienbuf->Lock(0,0,(void**)&lv,0);
    	lv[0].pos=D3DXVECTOR3(0,0,0);
    	lv[1].pos=D3DXVECTOR3(2,1,0);
    	lv[2].pos=D3DXVECTOR3(2,1,0);
    	lv[3].pos=D3DXVECTOR3(2,0,0);
    	lv[4].pos=D3DXVECTOR3(2,0,0);
    	lv[5].pos=D3DXVECTOR3(0,0,0);
    	lv[6].pos=D3DXVECTOR3(2,0,0);
    	lv[7].pos=D3DXVECTOR3(2,0,0);
    	lv[8].pos=D3DXVECTOR3(3,2,0);
    	lv[9].pos=D3DXVECTOR3(3,2,0);
    	lv[10].pos=D3DXVECTOR3(4,0,0);
    	lv[11].pos=D3DXVECTOR3(2,0,0);
    	for(int i=0;i<12;i++)
    		lv[i].color=D3DCOLOR_ARGB(255,0,0,0);
    	linienbuf->Unlock();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Graphisme::render()
    {
    	device->SetRenderState(D3DRS_AMBIENT,0xffffff);
    	device->SetMaterial(&material);
    	device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_MATERIAL);
    	device->SetFVF(TXVERTEXFORMAT);
    	device->SetTexture(0,texture);
    	device->SetStreamSource(0,dreickbuf,0,sizeof(texturevertex));
    	device->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    	device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_COLOR1);
    	device->SetFVF(LVERTEXFORMAT);
    	device->SetStreamSource(0,linienbuf,0,6);
    	device->DrawPrimitive(D3DPT_LINELIST,0,6);
    }

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    peux tu poster ou héberger les fichiers directement, pour pouvoir tester en live?

  15. #15
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Voila, (j'ai supprimé l'image, à vous d'en mettre une autre).
    Il faut Visual Studio 2008 SP1 pour l'exécuter.
    Fichiers attachés Fichiers attachés

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CDirectxAppView::OnTimer(UINT_PTR nIDEvent)
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de messages et/ou les paramètres par défaut des appels
    	if(dx.initf)
    	{
    		dx.render(); // ici tu effectue le rendu de ta scène ainsi que le Present
    		g.render(); // donc les actions que tu effectue ici sont invalides !!!
    	}
    	CView::OnTimer(nIDEvent);
    }
    en complément des commentaires ci dessus, le dessin de ta scène DOIT se trouver entre le BeginScene et le EndScene.

    ps: j'ai récupérer les anciens samples de directx utilisant dx9+mfc, j'essaie d'héberger ça.

  17. #17
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    Si c'était ça!!!
    Non, ça ne change rien. le pointeur sur la device reste NULL, d'où l'essai du déplacement de l'appel à g.render(). Ça bug au niveau de g.setup();

    raphchar

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    bon voilà un projet mfc+dx9 qui fonctionne, le code provient d'un site chinois, faut pas s'inquiéter des lettres bizarres XD
    Fichiers attachés Fichiers attachés

  19. #19
    Membre éclairé
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2008
    Messages
    522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 522
    Points : 725
    Points
    725
    Par défaut
    J'ai testé le mode Debug pour voir. Et sa bug bien avant.

  20. #20
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 395
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 395
    Points : 5 010
    Points
    5 010
    Par défaut
    le code que j'ai posté bug? ça marche pourtant chez moi ><

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/11/2010, 13h58
  2. Réponses: 4
    Dernier message: 24/08/2009, 12h38
  3. barre d'outils dans les MFC de visual c++
    Par TDDev dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2009, 21h18
  4. stockages des informations dans les Mfc
    Par khafor dans le forum MFC
    Réponses: 1
    Dernier message: 25/02/2007, 20h16
  5. Réponses: 10
    Dernier message: 05/01/2007, 21h54

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