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 :

(GDI vers DX)


Sujet :

DirectX

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut (GDI vers DX)
    Bonjour
    Je viens de finir une appli, qui permet de lire des images brutes format bayer issues de VPN rapides. L'affichage est fait avec GDI+, mais vu qu'il y a beaucoup de calcul sur les pixels, ca rame un peu lorsque on applique tous les algo d'interpolation. Je cherche à manipuler les pixels directeemnt dans la mémoire de la carte graphique. DirextX semble fait pour ca mais je ne sais pas par ou commencer. (je fais tout en .NET) cf http://perso.wanadoo.fr/letchideslandes/

    Une aide pour ce player de fichiers d'imzges fixes ?

  2. #2
    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
    Peux-tu faire une liste détaillée des manipulations que tu veux faire sur ces images ?

    Accéder avec le processeur central à la mémoire de la carte vidéo sera toujours plus lent qu'en mémoire système. Donc si tu veux t'appuyer sur les capacités d'accélération de ta carte graphique, il faudra que ton algo repose plus ou moins sur les fonctions cablées de ta carte (texture, pixel shading etc..).

    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

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Voila
    D'abord j'ai une version GDI qui fonctionne bien.
    Le principe du filtre de bayer est que chaque photosite de ton capteur est filtré par un masque de couleur. Les photosites sont organisés en matrice 4*4, avec 1.1 vert, 1.2 rouge,2.1 vert, 2.2 bleu. L'objet est de calculer les couleurs manquantes sur chaque photosite. Pour le vert par exemple en interpolant chaque pixel environnant (dessus,dessous,gauche, droit) on ontient un premier résultat satisfaisant.
    Pour ce faire, j'extrais le flux de données du fichier et le réorganise en un tableau de byte BleuVertRouge, représentation d'un bitmap dans windows. En occurant chaque terme du tableau, je calcule les manquant. :
    exemple
    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
    For Y As Integer = 0 To (Hauteur - 1)
                For X As Integer = 0 To (Largeur - 1) Step 2
                    If X > 2 And X < 509 Then
                        If Y > 2 And Y < 381 Then
                            If LignePaire Then
                                'vert
                                Somme = CInt(FluxBayer(Index + 1)) + CInt(FluxBayer(Index + 7)) + CInt(FluxBayer(Index - Ligne + 4)) + CInt(FluxBayer(Index + Ligne + 4))
                                Lumiere = CByte(Somme \ 4)
                                FluxBayer(Index + 4) = Lumiere
                                'rouge
                                FluxBayer(Index + 2) = FluxBayer(Index + 1)
                                FluxBayer(Index + 5) = Lumiere
                                'bleu
                                FluxBayer(Index) = FluxBayer(Index + 1)
                                FluxBayer(Index + 3) = Lumiere
                            Else
                                'vert
                                Somme = CInt(FluxBayer(Index - 2)) + CInt(FluxBayer(Index + 4)) + CInt(FluxBayer(Index - Ligne + 1)) + CInt(FluxBayer(Index + Ligne + 1))
                                Lumiere = CByte(Somme \ 4)
                                FluxBayer(Index + 1) = Lumiere
                                'rouge
                                FluxBayer(Index + 2) = Lumiere
                                FluxBayer(Index + 5) = FluxBayer(Index + 4)
                                'bleu
                                FluxBayer(Index) = Lumiere
                                FluxBayer(Index + 3) = FluxBayer(Index + 4)
                            End If
                        End If
                    End If
                    Index += 6
                Next
                LignePaire = Not LignePaire
            Next
    pour obtenir une image noir et blanc. Je cree une instance bitmap avec ce tableau grace à l'epinglage mémoire, puis je l'affiche dans un controle PictureBox. En effet, je voulais directement dessiner sur la surface de ma form mais j'obtiens un effet de scintillement genant, cependant j'obtiens de meilleurs performance, d'ou mon idée de gerer un backbuffer et de faire du flipping. Seulement en GDI j'ai pas trouvé de solution et mes connaissances en directx se cantonnent à directShow, mais j'ai bon espoir de déja gérer mon affichage à l'aide des classes direct3d graphics.
    Merci de ton aide


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  4. #4
    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
    ce genre d'algo semble en effet bien se preter à l'accélération par une carte graphique, en supposant que tu aies mis les trois composantes dans trois textures différentes, tu peux utiliser les capacités d'interpolation linéaire de ta carte et les capacités de blending de textures qui vont avec.

    Par contre, tu n'utilises que l'information du vert pour calculer ton image noir et blanc ? c'est à dire que si tu prends en photo une image à dominante rouge elle aparaitra noire ?

    Autre chose : essaie de mesurer les performances de ton algo en memoire systeme (sans affichage) pour voir si c'est l'affichage qui est couteux ou ton calcul.

    Enfin avant de te lancer dans DirectX, vois si tu peux optimiser ton calcul par exemple, en ne faisant pas les tests "if ligne paire" et "if X>.." à l'intérieur de la boucle.. C'est le genre de chose que tu peux déplacer très facilement en dehors d'une boucle et en général ça booste carrément les performances.

    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

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Ok pour les infos.
    Pour l'algo, c'est le prototype de demonstration de faisabilite. La version elaborée n'est pas pour l'instant publiée. Mon objectif est de
    1 charger en // les images en mémoire vers un tableau de byte
    2 appliqué un calcul d'interpolation des points manquants avec divers accentuation.
    3 afficher les images à une cadence d'environ 15 i.s-1 sans effet indesirable
    4 afficher si possible un histogramme de la densité de lumière ( ou de couleur) au meme frame rate

    Pour l' instant toutes les couches sont faites au niveau micro ( en .NET + GDI +) et lorsque j'active la couche 4, ca rame.
    1 et 2 tourne sans probléme sur un Bi PIII 933. 3 fonctionne sur un XP 2800.
    4 rame.
    De plus, faire du 2D en directX titillera mon ego, ce qui n'est pas pour me déplaire.
    Pour l'optimisation du code, je vais essayer les blits en C++ car .NET n'aime pas les les manipulations de pointeurs (j'utilise une classe GCHandle pour cela)
    En bref, j'en suis à initialiser une surface D3D, mais ne connais pas la terminologie Dx. Si je pouvais rapidement transférer un tableau de byte vers un back buffer de la carte graphique, manipuler les octets de ce buffer, puis faire un flip vers la surface primaire, j'aurais fait un grand pas.
    Merci pour votre aide

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci loulou pour la mise en page.

Discussions similaires

  1. D3DFORMAT vers un GDI pixelFormat ?
    Par SlimStyle dans le forum C++
    Réponses: 1
    Dernier message: 10/03/2013, 23h24
  2. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  3. [Kylix] De delphi vers Kylix : Et les HLP ?
    Par Beuz dans le forum EDI
    Réponses: 1
    Dernier message: 11/06/2002, 11h38
  4. Réponses: 2
    Dernier message: 30/05/2002, 10h19
  5. Réponses: 1
    Dernier message: 13/05/2002, 09h19

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