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 :

[Dx9] Dessiner un curseur par dessus une texture


Sujet :

DirectX

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut [Dx9] Dessiner un curseur par dessus une texture
    Bonjour,
    Voici mon problème avec Dx 9 :
    J'ai un programme qui affiche un texture dans la boucle de rendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pI_Sprite->Draw(pI_Texture,NULL,NULL,NULL,0xFFFFFFFF);
    Le problème qui se pose est que j'aimerais redessiner le curseur de la souris (dessiner un carré dont la taille change au cours du programme). Donc si je veux écrire sur la texture, je dois sauvegarder ce qu'il y avait avant dans la texture, dessiner mon curseur et dès que l'on rebouge la souris, je dois redessiner le curseur en effacant l'ancien (d'ou la sauvegarde).

    Je cherche une autre méthode plus perfomante, comment puis-je faire ?


    J'ai également un autre problème avec les coordonnées de la souris qui ne concerne probablement pas DirectX mais je préfère demander... Je récupère les coordonnées ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case WM_LBUTTONDOWN: 
    {
       p=MAKEPOINTS(lParam);
    ...
    Le problème c'est que j'ai un décalage en y mais pas en x. En fait, le décalage en y devient de plus en plus important quand y augmente (donc quand je descends mon curseur de souris dans ma fenêtre).

    Merci

  2. #2
    Membre averti Avatar de Bob.Killer
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    336
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 336
    Points : 332
    Points
    332
    Par défaut
    je comprend pas très bien ton curseur c windows qui te l affiche ou c un sprite à toi ?
    Si c windows qui le fait je te sugère de créer un sprite de ton curseur et le place grâce au coord de souris et de cacher celui de windows.

    je sais pas si g répondu... mais bon je pense ne pas avoir bien compris le pb...

  3. #3
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Oui, c'est un sprite. Comment dois je faire alors ?

  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
    Donc si je veux écrire sur la texture, je dois sauvegarder ce qu'il y avait avant dans la texture, dessiner mon curseur et dès que l'on rebouge la souris, je dois redessiner le curseur en effacant l'ancien (d'ou la sauvegarde)
    Moi je ne comprends pas très bien où se situe le problème. Pourquoi vouloir dessiner le curseur sur ta texture ?

  5. #5
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    En fait j'ai un décalage avec les coordonnées de la souris. Quand je dessine sur ma texture, je dessine toujours en dessous de mon curseur. Je récupère les coordonnées de la souris avec lParam dans WM_LBUTTONDOWN.
    Puisque je n'arrive pas à supprimer ce décalage, je voulais refaire moi même le curseur...

  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
    Oui mais pourquoi vouloir dessiner sur une texture plutôt que "normalement" sur le backbuffer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Boucle infinie
       Debut rendu
          Effacer backbuffer
          Afficher texture
          Afficher curseur
       Fin rendu
    Fin boucle
    Non :

  7. #7
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Comment utilise t-on le backbuffer avec DirectX9 ?

  8. #8
    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
    Citation Envoyé par SteelBox
    Comment utilise t-on le backbuffer avec DirectX9 ?
    Question étrange

    J'ai l'impression que ton approche de Dx et en général de la programmation 3D est "mauvaise", peut-être devrais-tu mieux te familiariser avec les samples, les tutos et la doc du SDK ?

    En l'occurence, ce qui me paraît étrange dans ton explication c'est qu'on n'a jamais besoin d'effacer, étant donné qu'on redessine tout à chaque frame. En plus on dessine rarement sur une texture (sauf application particulière), mais toujours sur le backbuffer (ce qui se fait par défaut).

  9. #9
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Ok, en fait j'avais pas besoin de backbuffer ici. DirectX9 gère seul la synchronisation de l'affichage (aucun flickers) donc y'a pas besoin de backbuffer. Ca aurait allourdi le programme pour rien...

    Donc, y'a pas d'autres moyens que le backbuffer selon vous ?

    Merci

  10. #10
    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
    Mais tu as toujours un backbuffer. Quand tu fais un DrawPrimitive ça dessine sur quoi selon toi ? J'ai l'impression que tu fais ton rendu de manière étrange.

  11. #11
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Ben je sais pas sur quoi elle dessine, un backbuffer surement :-)
    Si c'est le cas, je savais pas.
    Mais sinon, je vois pas pourquoi j'aurais besoin d'utiliser un backbuffer, c'est pas une obligation, DirectX gère tous seul le rendu. Je sais pas comment il se débrouille derrière, j'ai pas les sources de DirectX.
    Je disais donc que j'avais pas besoin d'utiliser un backBuffer...
    D'ailleurs, le problème est résolu, j'ai utiliser la méthode du XOR qui fonctionne très bien :
    couleur xor mask xor mask = couleur

    Je suis tout de même intéressé par le backbuffer et le DrawPrimitive. Peux tu appronfondir ?

    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
    Il est toujours bon de savoir en gros comment fonctionne une API, rien que pour ne pas être largué quand quelqu'un te pond une explication

    Lorsque tu affiches quelque chose (très certainement via DrawPrimitive ou DrawIndexedPrimitive), ce quelque chose est dessiné sur une surface. C'est le back buffer (ou color buffer). Il y a d'autres surfaces : le Z-Buffer, et le stencil buffer. Tu peux changer de backbuffer via Device->SetRenderTarget(), mais quoiqu'il en soit tu as toujours un backbuffer. C'est un élément de base du rendu graphique temps réel.
    Lorsque tu appelles Device->Present(...), cela effectue un flip entre le front buffer (ce qui est affiché à l'écran) et le backbuffer. C'est à dire que ça l'affiche à l'écran.

    Donc je ne te disais pas d'utiliser un backbuffer, puisque comme tu le dis si bien c'est DirectX qui le gère pour toi.

    Bref, tout ce que je viens de te raconter est l'utilisation normale de DirectX, c'est le rendu de base. Ce qui me fait me poser une question : comment effectues-tu ton rendu ? En l'occurence ces histoires d'effacement avec la méthode du XOR. Comme je l'ai déjà dit, étant donné que tu réaffiches tout à chaque frame, tu ne dois rien effacer. Ne me dis pas que tu affiches tes sprites à la main, pixel par pixel dans une texture

  13. #13
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Ok, je pensais pas que tu parlais du fonctionnement de DirectX, je croyais que tu me disais de déclarer et d'utiliser une deuxième texture...
    En l'occurence, je n'ai activé que le zbuffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );          // activation z-buffer
    Ne me dis pas que tu affiches tes sprites à la main, pixel par pixel dans une texture
    Au départ, je charge ma texture à partir d'une bmp et ensuite, effectivement je modifie les pixels à la main en lockant ma texture. En fait je fais un soft à usage assez spécifique et cette méthode marche très bien. C'est d'ailleurs l'une des meilleurs que j'ai trouvée puisque le rendu est excellent..

  14. #14
    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
    Tu peux décrire un peu ton soft ?

  15. #15
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    En fait, c'est un soft pour filtrer des images acquises par vidéo afin de repérer certains objets dans un décor. Le soft permet de sélectionner les plages de couleurs à prendre pour chaque objet que l'on souhaite repérer.

    Voilà
    Merci pour ton aide

  16. #16
    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
    Ok. Toujours est-il que tu peux afficher ton curseur normalement avec un ID3DXSprite ou un quad texturé

  17. #17
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Oui, mais le XOR est une bonne technique qui évite d'utiliser un sprite et le résultat produit est sympa

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

Discussions similaires

  1. Dessiner par-dessus une texture 2D
    Par dream_of_australia dans le forum OpenGL
    Réponses: 5
    Dernier message: 03/10/2009, 19h31
  2. Réponses: 4
    Dernier message: 15/08/2009, 14h07
  3. Dessiner par dessus une image
    Par bakaneko dans le forum C++Builder
    Réponses: 9
    Dernier message: 14/07/2007, 05h25
  4. Réponses: 3
    Dernier message: 31/10/2005, 16h47

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