[RESOLU][MY] import textures Android

Toutes les questions sur le développement Mobile, y compris la partie script.
Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

[RESOLU][MY] import textures Android

Message par Fasol0 » 31 Oct 2017 12:31

Bonjour à tous,

Je cherche à importer une texture depuis mon smartphone android, pour la mapper sur une sphère dans mon app Unity.
J'utilise la même méthode qui fonctionne parfaitement pour ma version PC (basée sur la classe WWW), mais sur Android, il m'est nécéssaire d'exécuter 2 fois la fonction pour que la texture soit correctement importée (j'obtient une texture blanche la première fois)

Voici mon implémentation:

Par appui sur un bouton, j'exécute la méthode suivante:

Code : Tout sélectionner

 public void OpenFile()
    {
        if(!loadingData)
        {
            StartCoroutine(LoadFile());
        }
    }
    
qui démarre la coroutine:

Code : Tout sélectionner

    IEnumerator LoadFile()
    {
        loadingData = true;
        fileAdress = new WWW(url);
        yield return fileAdress;
        if (string.IsNullOrEmpty(fileAdress.error))
        {
            GameObject.Find("Canvas/Panel/Display").GetComponentInChildren<Text>().text = "no error";
        }
        else GameObject.Find("Canvas/Panel/Display").GetComponentInChildren<Text>().text = fileAdress.error;        //Je n'obtiens jamais d'erreur ici

        Texture2D tex = new Texture2D(1024,1024);
        fileAdress.LoadImageIntoTexture(tex);
        fileAdress = null;

        sphere.GetComponent<Renderer>().material.mainTexture = tex;
        sphere.GetComponent<Renderer>().material.shader = shaderSphere;
        sphere.GetComponent<Renderer>().material.mainTextureScale = new Vector2(-1, 1);
       
        loadingData = false;
    }
je dispose de plusieures sphères sur lesquelles je peut mapper des textures, et le problème de devoir exécuter deux fois la fonction n'intervient plus lorsqu'une sphere a déjà reçu une première texture. le problème n'arrive donc que sur les spheres "vierges".

Merci d'avance pour toute aide!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY] import textures Android

Message par boubouk50 » 31 Oct 2017 12:56

Salut,
Teste avec un tex.Apply (); avant loadingData = false; pour voir.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [MY] import textures Android

Message par Fasol0 » 31 Oct 2017 13:16

Merci de ta réponse,

malheureusement ça n'a pas l'air de fonctionner..

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [MY] import textures Android

Message par Fasol0 » 31 Oct 2017 13:17

Quand j'applique la texture la première fois,
la sphère est blanche et non grise comme cela peut se passer pour un problème de format de texture,
comme si ma variable tex était vide.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY] import textures Android

Message par boubouk50 » 31 Oct 2017 14:18

Fasol0 a écrit :
31 Oct 2017 13:17
comme si ma variable tex était vide.
Tu peux le confirmer stp? Plus on aura d'info sur les variables utilisées et leur valeur mieux on pourra t'aider.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [MY] import textures Android

Message par Fasol0 » 31 Oct 2017 15:19

Je sais que la texture n'est pas nulle, et qu'elle prend bien les dimensions de la photo visée. Mais je ne vois pas comment vérifier qu'elle ne comporte que des pixels blancs.

Autrement j'ai essayé de passer par une autre méthode pour charger ma texture, via la classe File, et qui provoque exactement le même probleme: texture blanche au premier import, et correcte au second:

Code : Tout sélectionner

      if (File.Exists(subUrl))
           {
            Texture2D tex = new Texture2D(1024, 1024);
            byte[] imageData = File.ReadAllBytes(subUrl);
            tex.LoadImage(imageData); //tex prend bien les bonnes dimensions de la photo (ie override l'initialisation de la texture2D)
            sphere.GetComponent<Renderer>().material.mainTexture = tex;
            sphere.GetComponent<Renderer>().material.shader = shaderSphere;
            sphere.GetComponent<Renderer>().material.mainTextureScale = new Vector2(-1, 1);
        }

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY] import textures Android

Message par boubouk50 » 31 Oct 2017 17:57

Quelle taille fait l'image que tu importes? Est-elle bien en PoT? (puissance de 2)
Peux-tu tester la taille de l'image une fois dans tex, stp?
Essaie également de laisser un petit temps après le yield, histoire que l'image ne soit pas chargée après coup et donc mal prise en compte.
Je lisais ça pour le coup des textures non nulles mais pas bonnes:
https://forum.unity.com/threads/solved- ... ass.16459/
Jusqu'au dernier message ou sur mobile, www renvoie null au lieu d'une 8x8 vide. Mais c’est peut-être une piste.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Fasol0
Messages : 64
Inscription : 07 Avr 2015 11:43

Re: [MY] import textures Android

Message par Fasol0 » 10 Nov 2017 19:21

Mon problème a finalement disparu:

j'avais en plus un problème de leak de mémoire:
je ne pensais pas nécéssaire de préciser dans mon code avoir utilisé www.texture pour récupérer la résolution de l'image.
Il s'avère que chaque appel à www.texture crée une nouvelle texture qui n'est pas détruite même avec après Destroy de l'objet www. Dans mon cas j'utilise des images haute résolution et cela conduisait rapidement au crash de mon app.
D'autre part, je créait une instance de Texture2D (tex) au sein de ma fonction, qui faisait s'accumuler les textures en mémoire à chaque appel.

J'ai résolu ce problème par déclaration globale de ma Texture2D, pour réattribuer la texture à chaque chargement au lieu d'en créer une nouvelle, et en accédant aux informations de la texture par tex et non www.texture.

Code : Tout sélectionner

Texture2D tex;
void Start () {
        tex = new Texture2D(4, 4, TextureFormat.DXT1, false);
        }
        
         IEnumerator LoadFile()
    {
        WWW fileAdress = new WWW(url);
        yield return fileAdress;
        fileAdress.LoadImageIntoTexture(tex);
        //Get image resolution
        wRes = tex.width;
        hRes = tex.height;
        sphere.GetComponent<Renderer>().material.mainTexture = tex;
Un second problème est un bug reporté d'Unity (version 2017.1.2f1) particulièrement gênant:
https://issuetracker.unity3d.com/issues ... ring-twice

Lorsque l'on attribue plus d'une fonction déclenchées par OnClick() d'un Button, ces fonctions s'exécutent autant de fois que leur nombre.
Par exemple, j'ai un bouton auquel est associé 5 fonctions déclenchées par OnClick(), Un seul clic sur ce bouton déclenchera 5 fois chacune de ces 5 fonctions...
Ce bug m'a obligé à repenser une bonne partie de mon projet pour n'affecter qu'une seule fonction à chaque bouton.

La correction de ce deuxième problème a corrigé mon problème initial. Mais je reste déçu de ne pas avoir pu en identifier précisément la cause.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6215
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [MY] import textures Android

Message par boubouk50 » 13 Nov 2017 10:58

Merci pour ces informations/explications. :super:
Je passe le sujet en résolu du coup.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »