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

C# Discussion :

Affichage 2D : pourquoi pas OpenGL ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut Affichage 2D : pourquoi pas OpenGL ?
    Bonjour à tous,

    Dans une appli codée en VB.NET, j'ai une fenêtre de visualisation en 2D et une autre en 3D faite avec OpenTK.

    Quand je visualise une grosse pièce en 2D, vue de dessus (empilement de polygones en couleurs) l'affichage est lent.
    A chaque déplacement de la vue avec la souris il faut redessiner les polygones avec .fillPolygon()

    Nom : 2D.jpg
Affichages : 1807
Taille : 187,0 Ko

    Quand je visualise la même pièce en 3D avec OpenTK, c'est beaucoup plus fluide.
    Pourtant, à chaque déplacement de la vue avec la souris je dois demander à OpenGL de redessiner tous les triangles (150.000), et OpenGL fait le calcul de l'affichage 3D avec 3 sources lumineuses et pas mal de "raffinements"
    D'ailleurs je trouve ça un peu dommage, je n'ai pas compris comment demander à OpenGL de simplement déplacer la scène (ou mon point de vue) sans être obligé de rentrer la liste de tous les triangles à chaque affichage.

    Nom : 3D.jpg
Affichages : 1798
Taille : 227,9 Ko

    C'est facile à comprendre, la 3D avec OpenGL utilise l'accélération matérielle, la 2D avec VB.NET c'est les fonctions de System.Drawing...

    Dans les deux cas mon code source est optimisé, tous les calculs intermédiaires ou répétitifs sont évités, tout ce qui peut être pré-calculé l'est.

    Du coup je me demande si pour la vue en 2D je ne vais pas carrément utiliser OpenGL

    C'est un peu un marteau pour enfoncer une punaise mais OpenGL permet de faire de la 2D aussi (en désactivant DepthTest puis ensuite en ne donnant que des points Vertex2)
    Et ce sera super rapide puisque c'est la CG qui va faire le taf

    Qu'en pensez-vous ?

    Qu'avez vous utilisé pour vos logiciels de dessin ou de visualisation "2D" ?

    A bientôt

  2. #2
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Bonjour,

    Alors je me suis lancé pour utiliser OpenGL pour la 2D

    https://www.ntu.edu.sg/home/ehchua/p...roduction.html

    (voir aussi la pièce jointe en PDF)

    Aspects positifs :
    - affichage ultra-rapide
    - utilise le GPU et soulage le CPU
    - possibilité de faire des dégradés
    - possibilité d'utiliser des textures
    - OpenGL gère le clipping, les translations, les rotations, le zoom ; la navigation à la souris est plus facile à coder (une seule ligne GL.Ortho() suffit)
    - possibilité d'avoir une seule interface permettant d'avoir de la 2D et de la 3D
    - le contrôle OpenTK permet de gérer les événements aussi facilement qu'un PictureBox
    - OpenGL étant universel, le code est portable

    Aspects négatifs :
    - gros travail de réécriture du code
    - pas de courbes, pas de cercles, pas de polygones complexes, les formes en mode trait doivent êtres décomposées en segments de droites
    - les formes pleines doivent êtres décomposées en triangles (c'est parfois difficile, heureusement j'ai déjà résolut ce problème dans mon appli pour la 3D)
    - on ne peut pas afficher de texte sauf en "bricolant"

    Dommage que l'affichage de texte ne soit pas pris en charge, sinon j'aurais pu faire une partie l'interface de mon logiciel sous OpenGL (un peu comme dans un jeu vidéo)

    A bientôt
    Images attachées Images attachées

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    normalement il y a moyen d'être performant en windows forms, même s'il faut parfois tricher un peu (doublebuffering ou buffering manuel)
    je serais curieux de voir ton code pour savoir s'il est réellement optimisé ... parce qu'à priori il n'y a pas grand chose d'affiché non plus
    (il faut aussi éviter windows xp)

    on peut aussi avoir un rendu plus lissé (avec smooth quelque chose)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    normalement il y a moyen d'être performant en windows forms, même s'il faut parfois tricher un peu (doublebuffering ou buffering manuel)
    je serais curieux de voir ton code pour savoir s'il est réellement optimisé ... parce qu'à priori il n'y a pas grand chose d'affiché non plus
    (il faut aussi éviter windows xp)

    on peut aussi avoir un rendu plus lissé (avec smooth quelque chose)
    J'ai optimisé le code mais sans bidouiller

    Les coordonnées "écran" (en pixel) sont précalculées dans des tableaux d'entiers

    A chaque affichage, j'utilise les fonctions .DrawPolygon, FillPolygon, DrawEllipse, FillEllipse

    Dans le cas d'un déplacement à la souris, les données sont directement passées .DrawXXX et .FillXXX avec seulement une addition (translation)

    Ce code n'utilise pas le GPU, que le CPU avec GDI / GDI+

    Dans mon programme j'ai une partie 3D avec OpenGL beaucoup plus rapide (et ce n'est - pour l'instant - que de l'OpenGL 1.1 donc "lent", je suis en train de voir pour passer à OpenGL 3)

    Pour du dessin de formes géométriques (vectoriel) OpenGL me semble plus convaincant. D'autant que j'ai déjà un code de triangularisation de polygones qui fonctionne très bien, et de toutes façon mon programme ayant un affichage 3D OpenGL autant faire la 2D avec.

    Par contre tu me parles de doublebuffering ou buffering manuel et ça m'intéresse.

    En effet, dans mon programme il y a une partie ou je dois pouvoir éditer une image BMP (en gros comme MS Paint). C'est clair que je ne ferais pas ça en OpenGL

    Il faudra que ce clône de Paint soit le plus efficace possible :
    - edition au niveau du pixel avec un zoom
    - quelques fonctions de traitement d'image (filtres, contraste, remplacement de couleur...)

    Actuellement je travaille sur des données BMP mais pas en tant qu'image, directement en tant que données binaires (à la lecture du fichier puis sous forme de tableau de byte())

    Ce traitement est rapide mais "aveugle".

    Dans mon clone de Paint, je devrais à la fois pouvoir afficher les données BMP sous forme d'image et travailler sur les données rapidement (donc pas de GetPixel ni SetPixel )

    Autre difficulté : le lissage éventuel à l'affichage du BMP ne doit pas affecter les données

    A bientôt

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    (si c'est protected il faut hériter de control)

    sinon il y a la classe bufferedgraphics


    pour la modification de bmp : https://stackoverflow.com/questions/...ve-to-getpixel
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 999
    Par défaut
    Très intéressant tout ça !

    Je me souviens d'un échange sur ce forum où on avait parlé du marshaling, testé avec succès il y a quelques années

    Pour résumer, dans mon appli je dois avoir "en double" :
    - les données BMP sous forme d'un tableau d'octets ou d'entier (manipulées comme des données "normales")
    - un objet graphique pour l'affichage

    Dans le code :
    - Si un traitement (calcul) se fait sur les données, c'est seulement à la fin du traitement que les données sont envoyées d'un bloc vers l'objet graphique, pour affichage.
    - Si un traitement se fait via une fonction GDI / GDI+, à la fin du traitement je récupère les données bitmap de l'objet graphique d'un bloc pour les copier dans mon tableau.
    - La navigation à la souris pour l'affichage (translation, zoom) devra se faire sans conversions de données entre le tableau et l'objet graphique
    - Pour l'édition à la souris c'est moins critique car à chaque action de la souris le nombre de pixel en cause est limité (tout dépendra évidemment de la nature des fonctions d'éditions dont j'ai besoin, et si elle peuvent êtres faites directement avec les fonctions graphiques ou pas) ; on peut très bien imaginer que la conversion de données graphique -> tableau ne se fasse pas après chaque action "graphique" de la souris mais seulement avant de sauvegarder ou avant de débuter une opération travaillant sur le tableau, c'est facile à gérer avec un drapeau "ModifGraphique"

    Avec du code unsafe il y a moyen je pense d'écrire dans le bitmap aussi rapidement que dans le tableau d'octets ; un logiciel de dessin codé en C++ procède certainement ainsi.
    Cela évite d'avoir les données "en double" mais on contraint l'ordinateur à verrouiller en permanence l'emplacement en mémoire de l'objet graphique, ce qui va un peu à l'encontre de la philosophie des OS actuels.

    Le source (daté d'il y a 9 ans) de Paint.NET sur GitHub est intéressant à ce sujet : https://github.com/rivy/OpenPDN/blob...naryPixelOp.cs

    A bientôt

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

Discussions similaires

  1. [2D/3D] [OpenGL] Pas d'affichage dans le widget OpenGL
    Par Einde dans le forum Qt
    Réponses: 1
    Dernier message: 27/04/2015, 13h16
  2. Réponses: 3
    Dernier message: 05/06/2005, 01h52
  3. Affichage de données en OpenGL
    Par bennnun dans le forum OpenGL
    Réponses: 6
    Dernier message: 10/05/2005, 02h34
  4. [Language][DAO]Pourquoi pas des Singletons ?
    Par le Daoud dans le forum Langage
    Réponses: 11
    Dernier message: 04/05/2005, 09h16

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