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 :

Taille du backbuffer? Puissance de 2?


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut Taille du backbuffer? Puissance de 2?
    Bonjour
    Je lis le contenu de mon backbuffer et le sauve dans un tableau (ou plutot, un intptr) en utilisant le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (Surface s = m_device.GetRenderTarget(0)){
     GraphicsStream g = s.LockRectangle(LockFlags.ReadOnly);
      m_backBuffer = g.InternalData;
      s.UnlockRectangle();
     }
    Le gros problem est que si la taille de mon backbuffer n'est pas une puissance de 2, alors le contenu de mon array est comme decalé (il y a un offset sur la position).

    Qqn a-t'il une idée de comment je peux résoudre cela? D'avance merci

    P.S: A noter que le but de tout cela est décrit ici: http://www.developpez.net/forums/sho...81#post1368181

  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 : 40
    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
    Les surfaces DirectX ne contiennent pas que les pixels, des informations diverses peuvent être contenues à la fin des lignes. C'est pourquoi tu ne peux pas copier directement comme tu le fais, il faut faire ligne par ligne en utilisant le pitch.

    Tout ça est très bien décrit dans la doc du SDK, par exemple sur la page "Accessing Surface Memory Directly".

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Laurent Gomila
    Les surfaces DirectX ne contiennent pas que les pixels, des informations diverses peuvent être contenues à la fin des lignes. C'est pourquoi tu ne peux pas copier directement comme tu le fais, il faut faire ligne par ligne en utilisant le pitch.

    Tout ça est très bien décrit dans la doc du SDK, par exemple sur la page "Accessing Surface Memory Directly".
    Tu parles de cela? http://msdn.microsoft.com/archive/en...asp?frame=true
    Parce que c'est assez court... et je n'arrive pas à en ressortir qqch. Tu as par hasard un exemple concret de code?
    Je suis en plus assez surpris d'obtenir un pitch de 16384 avec une image de 4096*4096. Merci encore.

  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 : 40
    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
    Si ton back buffer fait 4096x4096 et ton pitch 16384, alors il faut copier 4096 pixels de chaque ligne mais ajouter 16384 pour passer à la suivante.

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Laurent Gomila
    Si ton back buffer fait 4096x4096 et ton pitch 16384, alors il faut copier 4096 pixels de chaque ligne mais ajouter 16384 pour passer à la suivante.
    Oui, mais cela voudrait alors dire que mon graphicsstream utilise 5x plus de place que mon image... c'est enorme!
    En admettant que cela soit juste, reste alors un dernier probleme. Comment reobtenir un intptr en partant d'un tableau de char ou int?
    Merci pour ton aide.

  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 : 40
    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
    Le pitch est en octets ; ta surface fait 4096 pixels qui j'imagine sont codés chacun sur 4 octets, ce qui nous fait bien 16384 octets par ligne.

    Ici il n'y a donc en fait pas de données ajoutées à la surface, tu n'as que les pixels.

    Quant à ton problème de intptr... Aucune idée, j'imagine que c'est spécifique à .NET puisque ça ne me dit rien du tout.

  7. #7
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Fynchi
    Le gros problem est que si la taille de mon backbuffer n'est pas une puissance de 2, alors le contenu de mon array est comme decalé (il y a un offset sur la position).
    Rien à voir avec les puissances de deux, le pitch et le nombre de pixels en largeur sont généralement indépendants, il faut donc que tu lises le pitch effectif depuis la structure retournée par la fonction LockRect. Le pitch est toujours indiqué en bytes (puisque c'est une opération sur les addresses !). Généralement tu as plusieurs bytes per pixel (dépendant de ton format..).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Ok. Resumons. J'ai une image de w x h pixels. Pour des raisons d'optimisation, elle est sauvee dans un buffer de m x n tel que m>=w et n = h (m est le pitch).
    Lorsque j'utilise la fonction LockRectangle(...), je suis cense recevoir une image de m x n.
    J'ai fait un essai avec une image de 2060x2060. La taille de mon buffer est alors de 4243600 et mon pitch de 10240. Mon buffer devrait avoir une taille donc de 10240/4 * 2060 = 5273600 alors qu'il a une taille de 4243600 (=2060*2060)/ Ce qui signifie alors que le contenu est deja bon. Ou est l'erreur?
    Merci

  9. #9
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Fynchi
    Ok. Resumons. J'ai une image de w x h pixels. Pour des raisons d'optimisation, elle est sauvee dans un buffer de m x n tel que m>=w et n = h (m est le pitch).
    Lorsque j'utilise la fonction LockRectangle(...), je suis cense recevoir une image de m x n.
    J'ai fait un essai avec une image de 2060x2060. La taille de mon buffer est alors de 4243600 et mon pitch de 10240. Mon buffer devrait avoir une taille donc de 10240/4 * 2060 = 5273600 alors qu'il a une taille de 4243600 (=2060*2060)/ Ce qui signifie alors que le contenu est deja bon. Ou est l'erreur?
    Merci
    Qu'est-ce que LockRectangle ? c'est du managed directx ?
    De quelle taille de buffer parles-tu ? est-ce que c'est LockRectangle qui te la renvoie ?

    En interne dans la carte graphique, le buffer est représenté (modulo quelques détails d'architecture) comme un tableau de pitch * height octets. Et c'est un pointeur vers cette structure que te retourne LockRect (en regular C++).

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  10. #10
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Moi, j'utilise cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    using (Surface s = m_device.GetRenderTarget(0)){
      int pitch;
      GraphicsStream g = s.LockRectangle(LockFlags.ReadOnly,out pitch);
      m_backBuffer = g.InternalData;
      s.UnlockRectangle();
     }
    et pour le test précédemment cité, j'utilise cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (Surface s = m_device.GetRenderTarget(0)){
      int pitch;
      SColor[,] m_backBuffer = (SColor[,])s.LockRectangle(typeof(SColor), LockFlags.ReadOnly, out pitch,m_viewRect.Width, m_viewRect.Height );
              s.UnlockRectangle();
    }
    Honnetement... je ne pige pas.
    Merci pour votre aide.
    A+

  11. #11
    Futur Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    IntPtr m_backBuffer;
    using (Surface s = m_device.GetRenderTarget(0)){
      int pitch;
      GraphicsStream g = s.LockRectangle(LockFlags.ReadOnly,out pitch);
      m_backBuffer = g.InternalData;
      s.UnlockRectangle();
     }
    En parlant de ce code, savez-vous si je peux faire cela? Cela marche actuellement, mais je me demande si j'ai vraiment la garantie que mon pointer m_backbuffer reste obligatoiremetn valide une fois la methode UnlockRectange appelee.
    Merci

  12. #12
    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 : 40
    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
    En parlant de ce code, savez-vous si je peux faire cela? Cela marche actuellement, mais je me demande si j'ai vraiment la garantie que mon pointer m_backbuffer reste obligatoiremetn valide une fois la methode UnlockRectange appelee.
    Non. Une fois la surface déverrouillée, tu n'y as plus accès. Si tu veux garder des données de cette surface il faut les avoir copiées durant le verrouillage.

Discussions similaires

  1. FFT et images dont la taille n'est pas une puissance de deux
    Par BarBiTueRie dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 11/05/2011, 10h27
  2. Connaitre la taille de la RAM
    Par dway dans le forum Assembleur
    Réponses: 23
    Dernier message: 15/09/2004, 10h05
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  4. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 20h06
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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