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

Unity Discussion :

Conversion tableau image


Sujet :

Unity

  1. #1
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut Conversion tableau image
    Bonjour à tous

    je cherche à programmer un automate cellulaire type "jeu de la vie" sous Unity.
    J'ai un problème : je ne sais pas comment convertir un tableau d'entiers en image.
    Quelle type de structure dois-je utiliser ? Quelles méthodes sont disponibles pour modifier un pixel d'une image ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  2. #2
    Membre éprouvé Avatar de Tonton Nico
    Homme Profil pro
    Ingénieur
    Inscrit en
    septembre 2017
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : septembre 2017
    Messages : 357
    Points : 1 089
    Points
    1 089
    Par défaut
    Salut,

    Tu as regardé/testé https://docs.unity3d.com/ScriptRefer....SetPixel.html à tout hasard?
    TontonNico

    On me dit souvent que je ressemble à Einstein... mais plutôt à Frank que Albert

  3. #3
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Merci, c'est exactement ce que je recherche !
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Bonjour,
    Je suppose qu'à chaque élément de votre tableau vous alles faire correspondre un carré sur votre texture c'est à dire non pas un mais plusieurs pixels.
    Auquel ca vous allez être confronté à un problème de performance avec SetPixel.
    La première solution est de traiter les pixels par colonnes par "SetPixels" :
    https://docs.unity3d.com/ScriptRefer...SetPixels.html
    Une autre approche serait de passer par un traitement vectoriel en passant par exemple par le package "Vector Garphics" (Menu Widows>Packege Manager).
    C'est nettement plus complexe mais très efficace.

    Yves

  5. #5
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Effectivement, j'ai l'intention d'utiliser de préférence la méthode SetPixels. Par contre je ne comprends pas ce que signifie le paramètre miplevel dans la méthode. Après l'usage de cette méthode qui semble permettre de remplir un rectangle entier codé en linéaire, j'appellerai la fonction Apply pour rafraîchir mon image. Par contre comme je débute en Unity, je ne sais pas du tout comment intégrer ce principe à un projet 2D standard et obtenir un affichage approprié. La méthode GetRawTextureData me semble aussi très adaptée à mes besoins. Merci en tout cas à vous de m'avoir aiguillé sur la documentation d'Unity. Je ne connaissais pas cette ressource. Cette documentation est très bien faite, je trouve, et les exemples sont simples et pertinents. Je m'en vais fouiller.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  6. #6
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    J'ai opté pour la méthode GetRawTextureData. Cependant rien ne s'affiche, j'ai beau lier le script à la caméra principale, une exception me dit que je tente d'accéder à un renderer qui n'existe pas. J'ai pourtant copié le script ci-dessous et je l'ai lié à la caméra principale, rien ne se passe. Que faut-il faire pour faire fonctionner ce script sous Unity ?

    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
     
    using UnityEngine;
     
    public class ExampleScript : MonoBehaviour
    {
        void Start()
        {
            var texture = new Texture2D(128, 128, TextureFormat.RGBA32, false);
            GetComponent<Renderer>().material.mainTexture = texture;
     
            // RGBA32 texture format data layout exactly matches Color32 struct
            var data = texture.GetRawTextureData<Color32>();
     
            // fill texture data with a simple pattern
            Color32 orange = new Color32(255, 165, 0, 255);
            Color32 teal = new Color32(0, 128, 128, 255);
            int index = 0;
            for (int y = 0; y < texture.height; y++)
            {
                for (int x = 0; x < texture.width; x++)
                {
                    data[index++] = ((x & y) == 0 ? orange : teal);
                }
            }
            // upload to the GPU
            texture.Apply();
        }
    }
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Effectivement, ce n'est pas à la camera qu'il faut affecter la texture et le script.

    Compte tenu de la nature de votre appli, vous pourriez vous contenter d'utiliser uniquement l'interface utilisateur (UI) - camera et scène seront inutiles.
    Créer un panel qui va couvrir toute la surface du canvas de l'UI et donnera un fond à l'appli.
    Créer un RawImage sur le canvas dont la propriété texture vous servira à afficher votre grille avec tous les éléments d'interface nécessaires.
    C'est donc à ce RawImage qu'il faudra affecter votre script en accédant classiquement à cette propriété par GetComponent<RawImage>().texture.

    Le temps me manque pour plus d'explications mais je vous encourage à prendre le temps de bien assimiler l'architecture de Unity avant d'aller plus loin.
    Si comme moi vous venez d'un environnement classique (Builder C++ en ce qui me concerne) c'est vraiment très déroutant au début et il faut pas mal de patience.
    Mais cela vaut le coup.
    Unity est un outil extraordinairement productif, puissant et souple à qui sait y consacrer le temps d'apprentissage nécessaire.
    Son domaine d'utilisation va maintenant bien au delà jeux...

    Tenez nous au courant.

    Bon courage

    Yves

  8. #8
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Merci pour votre réponse. J'ai fait ce que vous proposiez, j'ai supprimé la caméra (mais je n'ai pas réussi à supprimer SampleScene, je suppose que c'est parce que c'est la racine). J'ai ajouté un Panel et une RawImage, j'ai lié le script à RawImage, j'ai modifié le code avec l'instruction que vous donniez et j'ai appuyé sur play. Mais ça ne marche pas. Le compilateur me dit qu'il ne trouve pas RawImage. J'ai l'erreur suivante : The type or namespace name 'RawImage' could not be found (are you missing a using directive or an assembly reference?)

    J'ai vérifié, j'ai bien fait comme vous le proposiez, je ne crois pas avoir fait d'erreur dans la démarche. D'où vient ce problème ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Citation Envoyé par anadoncamille Voir le message
    Merci pour votre réponse. J'ai fait ce que vous proposiez, j'ai supprimé la caméra (mais je n'ai pas réussi à supprimer SampleScene, je suppose que c'est parce que c'est la racine). J'ai ajouté un Panel et une RawImage, j'ai lié le script à RawImage, j'ai modifié le code avec l'instruction que vous donniez et j'ai appuyé sur play. Mais ça ne marche pas. Le compilateur me dit qu'il ne trouve pas RawImage. J'ai l'erreur suivante : The type or namespace name 'RawImage' could not be found (are you missing a using directive or an assembly reference?)

    J'ai vérifié, j'ai bien fait comme vous le proposiez, je ne crois pas avoir fait d'erreur dans la démarche. D'où vient ce problème ?
    Il faut rajouter using UnityEngine.UI en entête

  10. #10
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Youpiii ! Tout a très bien marché cette fois-ci ! J'ai réussi à faire mon premier jeu de la vie fonctionnel sous Unity ! Merci à vous tous pour votre soutien et vos réponses !
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Bon début 👍

    Yves

  12. #12
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Merci, effectivement ça fait plaisir de réussir à démarrer dans ce vaste monde qu'est Unity. Par contre je suis un peu déçu par les performances du C# sous Unity : j'utilise le même algorithme que d'habitude (je travaille en Java) et ça tourne moins vite pour une surface plus petite que dans mon logiciel phare, AnAcondA. D'ailleurs, si vous voulez voir ce dernier, rendez-vous sur mon site ! AnAcondA est gratuit et contient plus de 90 applications dont de nombreux automates cellulaires en 2D et en 3D (les automates, c'est mon violon d'Ingres).

    Merci encore pour votre participation, je n'y serais pas arrivé sans vous !
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  13. #13
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    Et le voilà dans son environnement :

    Nom : Image3.jpg
Affichages : 43
Taille : 78,5 Ko
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  14. #14
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Sur la question de la vitesse, vous avez généré une appli compilée (File>Build Settings) ?

    Yves

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    mars 2003
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur multiplateformes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : mars 2003
    Messages : 257
    Points : 570
    Points
    570
    Par défaut
    Toujours sur la question de la vitesse il faut voir si vous utilisez la méthode Update(), ce qu'il y a dedans et ce que cela implique…

    Yves

  16. #16
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    J'ai généré une appli compilée et ça va déjà plus vite. C'est sensiblement équivalent à la vitesse que j'obtiens en Java. J'ai cependant un problème. La surface de jeu est de 240x240 cases et l'image correspondante fait donc 240x240 pixel. J'ai zoomé cette image 3 fois pour qu'elle remplisse l'écran dans un carré de 720x720 pixels. Mais Unity applique un filtre qui fait du flou sur l'image. Les pixels grossis ne sont pas nets. Comment faire pour avoir des pixels zoomés nets ? J'ai eu beau chercher et tester je n'ai rien trouvé pour y parvenir. C'est une histoire de filtre. Unity applique un filtre après avoir zoomé l'image et je voudrais qu'il n'applique aucun filtre, qu'il zoome l'image et la laisse brute. Je pense que ça améliorerait les performances. Mais le plus important c'est l'aspect esthétique. Ce flou est des plus moches et j'aimerais avoir des cellules bien nettes. Comment faire ?

    Pour revenir sur la question des performances, dans la méthode update il y a deux appels de méthode. La première méthode calcule la génération suivante du jeu de la vie et la seconde méthode transforme le tableau d'entiers en image. C'est le minimum et je ne peux pas faire plus optimal, je pense.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  17. #17
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 952
    Points : 9 146
    Points
    9 146
    Par défaut
    Le filtre en question , c'est sûrement du (Bi)linear , je connais pas Unity , mais doit sûrement y'avoir une proposition du Nearest pour les textures

  18. #18
    Membre actif
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juillet 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2007
    Messages : 336
    Points : 257
    Points
    257
    Billets dans le blog
    1
    Par défaut
    J'ai fouillé dans les paramètres de l'image, je n'ai rien trouvé. Mais je suis d'accord, c'est certainement un filtre bilinear et je recherche du nearest sans le trouver. Je ne sais pas quoi faire. Voilà ce que j'obtiens, une image floue (build Unity) :

    Nom : Image1.jpg
Affichages : 28
Taille : 114,0 Ko

    Et voilà ce que je voudrais, une image nette (AnAcondA) :

    Nom : Image1.jpg
Affichages : 30
Taille : 149,9 Ko

    Si vous avez une idée de ce qu'il faut faire pour obtenir une image nette, je suis preneur !
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 595
    Points : 30 158
    Points
    30 158
    Billets dans le blog
    4
    Par défaut
    D'après Google c'est le filter mode qu'il faut mettre à Point.
    Cela dit, je sais pas si ce que tu fais sera le mieux point de vue performance.
    Si la texture est en GPU, ce que je pense que Unity fait parce que c'est un peu la base pour les afficher rapidement dans un jeu, chaque fois que tu vas la modifier il va falloir la renvoyer sur le GPU, donc ton code va vite devenir lourd sur cette commande.
    L'idéal serait de faire ça via un shader, donc tout en GPU. Là tu vas taper dans ce qu'il y a de mieux pour les performances.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  20. #20
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 952
    Points : 9 146
    Points
    9 146
    Par défaut
    Je suis pas sur là , il faudra un shader complexe pour faire ce genre de truc , techniquement je suis pas sur que le faire via Unity soit la meilleur solution.
    J'aurais proposer SDL2 , tu fait tout en software , et tu envoie au GPU à la fin

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. conversion type Image vers tableau
    Par elektronik-17 dans le forum Débuter
    Réponses: 6
    Dernier message: 22/08/2008, 01h47
  2. Conversion tableau en image
    Par axel119 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 11/08/2007, 15h54
  3. conversion d'image jpeg en tableau de pixel
    Par sophie86 dans le forum Multimédia
    Réponses: 7
    Dernier message: 09/11/2005, 12h30
  4. Conversion d'images 24/32 Bits -> 16bits
    Par RVP dans le forum Langage
    Réponses: 4
    Dernier message: 30/05/2004, 18h05
  5. Conversion avi->image
    Par lio_on_jb_groove dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 11h11

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