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 :

[directdraw & c++]avoir la surface directdraw du rendu video


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut [directdraw & c++]avoir la surface directdraw du rendu video
    Hi

    J'utilise l'interface IDirectDrawVideo du Video Renderer Filter. Grace à la méthode GetDirectDraw je peux avoir l'objet DIRECTDRAW (le video renderer filter étant connecté à la source de capture)
    Mais je ne sais pas comment obtenir la primary directdraw surface de l'objet DIRECTDRAW ? (cest à dire que je veux la surface directdraw de rendu les frames sont affichées, car apres je veux utiliser BltFast sur la primary surface)

    Une idée ?

    (J'ai essayé d'utiliser la méthode GetGDISurface de l'objet DIRECTDRAW mais on dirait que cest la surface du bureau, cest à dire une surface indépendante de la surface de rendu et vraiment grande comme le bureau)

    merci

    win xp sp2
    directx9.0c
    platform SDK server R3

    (jai reposté ici car cest plus approprié que dans la section jeux 2D/3D, me suis trompé erf)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Apparement il est possible de l'obtenir avec IDirectDrawVideo::GetSurfaceDesc qui me donne les caractéristique de la surface mais je ne pensais pas quil donnerait aussi un pointer sur celle-ci: lpSurface pointer

    typedef struct _DDSURFACEDESC{
    DWORD dwSize;
    DWORD dwFlags;
    DWORD dwHeight;
    DWORD dwWidth;
    LONG lPitch;
    DWORD dwBackBufferCount;
    DWORD dwZBufferBitDepth;
    DWORD dwAlphaBitDepth;
    LPVOID lpSurface;
    DDCOLORKEY ddckCKDestOverlay;
    DDCOLORKEY ddckCKDestBlt;
    DDCOLORKEY ddckCKSrcOverlay;
    DDCOLORKEY ddckCKSrcBlt;
    DDPIXELFORMAT ddpfPixelFormat;
    DDSCAPS ddsCaps;
    } DDSURFACEDESC, FAR* LPDDSURFACEDESC;

    faudra que je test

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    j'initialise directdraw avec cette fonction pour mon moteur graphique:

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    static int
    _directdraw_init (HWND                 window,
    		  LPDIRECTDRAW        *object,
    		  LPDIRECTDRAWSURFACE *surface_primary,
    		  LPDIRECTDRAWSURFACE *surface_back,
    		  int                 *depth,
    		  int                  width,
    		  int                  height)
    {
       DDSURFACEDESC2      surface_desc;
       DDPIXELFORMAT       pixel_format;
       LPDIRECTDRAWCLIPPER clipper;
       LPDIRECTDRAW        o;
       DDSURFACEDESC2     *sd;
       HRESULT             res;
     
       res = DirectDrawCreateEx (NULL, (void **)&o, &IID_IDirectDraw7, NULL);
       if (FAILED(res))
         return 0;
     
       res = IDirectDraw7_SetCooperativeLevel (o, window, DDSCL_NORMAL);
       if (FAILED(res))
         {
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       res = IDirectDraw7_CreateClipper (o, 0, &clipper, NULL);
       if (FAILED(res))
         {
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       res = IDirectDrawClipper_SetHWnd (clipper, 0, window);
       if (FAILED(res))
         {
    	IDirectDrawClipper_Release (clipper);
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       memset(&surface_desc, 0, sizeof(surface_desc));
       surface_desc.dwSize = sizeof(surface_desc);
       surface_desc.dwFlags = DDSD_CAPS;
       surface_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
     
       sd=&surface_desc;
       res = IDirectDraw7_CreateSurface (o, &surface_desc,
    				     surface_primary, NULL);
       if (FAILED(res))
         {
    	IDirectDrawClipper_Release (clipper);
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       res = IDirectDrawSurface7_SetClipper (*surface_primary, clipper);
       if (FAILED(res))
         {
    	IDirectDrawClipper_Release (clipper);
    	IDirectDrawSurface7_Release (*surface_primary);
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       memset (&surface_desc, 0, sizeof(surface_desc));
       surface_desc.dwSize = sizeof(surface_desc);
       surface_desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
       surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
       surface_desc.dwWidth = width;
       surface_desc.dwHeight = height;
     
       sd=&surface_desc;
       res = IDirectDraw7_CreateSurface (o, (DDSURFACEDESC *)sd,
    				     surface_back, NULL);
       if (FAILED(res))
         {
    	IDirectDrawClipper_Release (clipper);
    	IDirectDrawSurface7_Release (*surface_primary);
    	IDirectDraw7_Release (o);
    	return 0;
         }
     
       ZeroMemory(&pixel_format, sizeof(pixel_format));
       pixel_format.dwSize = sizeof(pixel_format);
       IDirectDrawSurface7_GetPixelFormat(*surface_primary, &pixel_format);
     
       *object = o;
       *depth = pixel_format.dwRGBBitCount;
     
       return 1;
    }
    c'est pour le mode fenêtré, avec un backbuffer pour la surface.

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    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 540
    Par défaut
    Citation Envoyé par jhonnyBravo Voir le message
    Apparement il est possible de l'obtenir avec IDirectDrawVideo::GetSurfaceDesc qui me donne les caractéristique de la surface mais je ne pensais pas quil donnerait aussi un pointer sur celle-ci: lpSurface pointer
    tu peux dessiner avec IDirectDrawSurface::Lock et Unlock et même faire du GDI .
    Que veux tu faire ? dessiner sur une surface DD ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Donc j'ai essayé "GetSurfaceDesc" (return S_OK) mais l'attribut lpSurface est NULL... bizare car les attributs dwWidth et dwHeight de surfaceDesc sont corrects : 320 * 240 , qui est bien la taille de la capture source.

    (Le but étant de faire ce que lon peut faire avec directdraw, lorsque direct3D nest pas disponible.)

    qqn saurait pk le pointer lpSurface de DDSURFACEDESC est NULL alors que la taille est bonne ? Y a til une manip à faire? une solution?

    thx

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    J'apporte des infos supplémentaires en esperant que qqn puisse m'aider.

    En effet, je ne pas fais attention (et je men veux), dans la doc il y a marqué:
    "dwSize: Size of the structure. Must be initialized prior to use."

    Donc je l'ai d'abord initialisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DDSURFACEDESC surfaceDesc ;
    surfaceDesc.dwSize = sizeof(DDSURFACEDESC) ;
    IDirectDrawVideo* m_pdd ;
    m_pdd->GetSurfaceDesc(&surfaceDesc) ;


    Ensuite j'ai print quelques membres de surfaceDesc et ca donne :

    surfaceDesc.dwSize: 108 (je ne sais pas si cest correct)
    surfaceDesc.dwWidth: 320 (correct)
    surfaceDesc.dwHeight: 240 (correct)
    surfaceDesc.dwBackBufferCount: 0 (je ne sais pas si cest correct)
    surfaceDesc.dwFlags: 4111 (je ne sais pas si cest correct)
    surfaceDesc.lpSurface: NULL (voila le pb, pk cest NULL?)

    une idée? que puis je essayer?

    thx

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Par défaut
    pour surfaceDesc.dwSize, met sizeof (surfaceDesc)

    pour les flags, il te faut au moins DDSD_HEIGHT | DDSD_WIDTH

    je te conseille de lire ce lien pour l'initialisation de directdraw:

    http://www.gamedev.net/reference/art...article608.asp

    il y a 2 parties, l'une pour l'initialisation en plein ecran, l'autre dans une fenetre

    Une fois que l'initialisation est faite, tu peux recuperer le contenu de ta surface avec la methode Lock. J'utilise cette fonction:

    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
    void *
    evas_software_ddraw_lock(Outbuf *buf, int *ddraw_width, int *ddraw_height, int *ddraw_pitch, int *ddraw_depth)
    {
       DDSURFACEDESC2 surface_desc;
     
       ZeroMemory(&surface_desc, sizeof(surface_desc));
       surface_desc.dwSize = sizeof(surface_desc);
     
       if (FAILED(IDirectDrawSurface7_Lock(buf->priv.dd.surface_back, NULL,
                                           &surface_desc,
                                           DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR,
                                           NULL)))
         return NULL;
     
       *ddraw_width = surface_desc.dwWidth;
       *ddraw_height = surface_desc.dwHeight;
       *ddraw_pitch = surface_desc.lPitch;
       *ddraw_depth = surface_desc.ddpfPixelFormat.dwRGBBitCount >> 3;
     
       return surface_desc.lpSurface;
    }
    une fois que tu as bien bidouille les donnees de ta surface, il faut la verrouiller. J'utilise cette fonction

    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
    void
    evas_software_ddraw_unlock_and_flip(Outbuf *buf)
    {
       RECT    dst_rect;
       RECT    src_rect;
       POINT   p;
     
       if (FAILED(IDirectDrawSurface7_Unlock(buf->priv.dd.surface_back, NULL)))
         return;
     
       /* we figure out where on the primary surface our window lives */
       p.x = 0;
       p.y = 0;
       ClientToScreen(buf->priv.dd.window, &p);
       GetClientRect(buf->priv.dd.window, &dst_rect);
       OffsetRect(&dst_rect, p.x, p.y);
       SetRect(&src_rect, 0, 0, buf->width, buf->height);
     
       /* nothing to do if the function fails, so we don't check the result */
       IDirectDrawSurface7_Blt(buf->priv.dd.surface_primary, &dst_rect,
                               buf->priv.dd.surface_back, &src_rect,
                               DDBLT_WAIT, NULL);
    }
    Elle verrouille (unlock) et echange les 2 surfaces. Il te faudra certainement modifier du code pour ton prog

    En esperant que ca t'aide

Discussions similaires

  1. pitch d'une surface directdraw en 16bits
    Par d'Oursse dans le forum Windows
    Réponses: 3
    Dernier message: 23/08/2007, 20h37
  2. Réponses: 8
    Dernier message: 10/05/2006, 20h56
  3. Pb lors de l'accès à une surface DirectDraw
    Par Mark53 dans le forum DirectX
    Réponses: 8
    Dernier message: 30/11/2004, 00h03
  4. Réponses: 1
    Dernier message: 12/05/2004, 19h02
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37

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