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 :

Lecture et écriture dans une texture : correct ou non ?


Sujet :

DirectX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Par défaut Lecture et écriture dans une texture : correct ou non ?
    Salut,

    J'ai un petit soucis, cette fois-ci pas de résultat, mais de méthode.

    Je souhaite avoir accès aux données de textures chargées/créées en mémoire vidéo, d'une part pour les lire, d'autre part pour les modifier.

    J'utilise pour cela le LockRect de l'interface IDirect3DTexture9 qui me permet de récupérer un pointeur (void* pBits) vers les données de la texture.

    Une fois ce pointeur récupéré, je parviens sans bug à effectuer toute sorte d'opérations sur la texture ou à partir de celle-ci, lecture, édition, enregistrement dans un fichier, etc...
    Là ou je me pose une question, c'est que avec ou sans le LockRect, une fois que j'ai récupéré le pointeur, je peux effectuer des opérations sur la texture sans que ce soit plus lent ou que ça plante. Histoire de m'embrouiller un peu plus, j'ai essayé le LockRect en ReadOnly ou sans aucun flag de mode de vérouillage, et je peux toujours effectuer toute sorte d'opérations.

    Donc, quelle est la méthode "conventionnelle" pour pouvoir lire et écrire des données dans une texture ? La méthode que j'utilise est-elle correcte ou non ?

    Tant qu'à faire, je souhaiterais avoir une méthode aussi bonne que le résultat...

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 132
    Par défaut
    (hop, tag parce que ça m'interesse aussi)

  3. #3
    Membre Expert

    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
    Par défaut
    Tout dépend comment la texture a été créé, si c'est le pool managed, tu peux faire tout ce que tu veux avec la texture lire, écrire. En fait le runtime va te renvoyer le pointeur vers la copie qu'il maintient en mémoire système et notifier le driver si tu l'as verrouillé en écriture (pour mettre à jour la copie du driver). Cette mise à jour va être plus ou moins lente suivant la taille de la texture et la fréquence des modifications (et le type de système sur lequel ça tourne).

    Si c'est le pool default, tu ne peux locker que les textures créées avec le flag "USAGE_DYNAMIC" (il faut que le device exporte la capacité d'avoir des textures dynamiques), et tu ne peux que écrire (pas lire, y compris les "read/modify/write"). Pour lire le résultat d'un rendu préalable, il faut utiliser GetRenderTargetData et non pas lockrect.

    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

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Par défaut
    Merci pour la réponse

    Dans mon cas, j'utilise Pool Managed lors de la création de la texture.

    Par rapport aux LockRect, est-il nécessaire que je suive à chaque lecture/écriture de données la procédure : LockRect - Opérations - UnlockRect, sachant qu'une fois que j'ai récupéré le pointeur vers les données de la texture, je peux agir dessus depuis n'importe quel endroit du code, avec ou sans le LockRect ?

  5. #5
    Membre Expert

    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
    Par défaut
    la mise à jour ne sera effective qu'au moment du unlock, et donc si c'est utilisé dans un rendu, il faut appeler unlock au moins une fois avant le draw call pour que le runtime ait l'opportunité de mettre à jour la copie du driver.

    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

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Par défaut
    Curieux... Même sans passer par le UnlockRect, la mise à jour a quand même lieu dans mon programme d'essai. Bon, je vais imaginer qu'elle n'a pas lieu et utiliser Lock + Unlock dans les règles de l'art ^^

    Je devrais pouvoir me débrouiller à présent, encore merci

Discussions similaires

  1. Datastage : lecture puis écriture dans une même table
    Par coulio dans le forum DataStage
    Réponses: 3
    Dernier message: 19/08/2011, 15h46
  2. Réponses: 0
    Dernier message: 05/04/2011, 01h09
  3. Lecture/écriture dans une mémoire protégée :S en C#
    Par ArnaudDev dans le forum Windows
    Réponses: 7
    Dernier message: 09/06/2008, 15h24
  4. Réponses: 13
    Dernier message: 29/04/2008, 09h41
  5. lecture et écriture dans une base :o
    Par kayobil dans le forum VB.NET
    Réponses: 11
    Dernier message: 28/09/2007, 19h26

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