Je veux bien utiliser un shader si cela peut résoudre mon problème, mais je ne sais pas du tout comment faire. Quelle est la procédure à suivre ?
Je veux bien utiliser un shader si cela peut résoudre mon problème, mais je ne sais pas du tout comment faire. Quelle est la procédure à suivre ?
Bonjour Kannagi,
Il faut afficher l'évolution de la scène en temps réel…
Pour aller plus vite l'autre solution serait effectivement de passer en C++ sur des environnements vectoriels comme SDL2 sous Visual C++ ou Builder C++ sous FMX (Embarcadero) qui est assez simple à mettre en œuvre (version de base gratuite mais Windows uniquement, le multiplateforme n'est pas au point).
Cependant j'aurais tendance à penser comme Bousk qu'il y aura sans doute plus à gratter en cherchant du coté des méthodes d'affichage sur Unity.
A voir.
Yves
Oui le shader sera plus compliqué, mais si on veut vraiment un truc performant on peut rarement se contenter de simplicité.
Un bon compromis serait d'avoir tout en CPU. Tout étant un simple tableau de bool pour savoir si la case est allumée ou éteinte.
Puis on balance ça au GPU, et un shader allume ou éteint chaque pixel sur une texture de base - et là c'est un shader assez trivial.
Mais j'utiliserais jamais Unity pour ça : avec C++/SFML ce serait plié en 2h. Et ce sera multiplateforme automatiquement via SFML (donc toutes les plateformes que SFML supporte) vu que SFML utilise OpenGL, et il n'y a absolument aucun code spécifique plateforme à utiliser de mon bord.
N'y a-t-il aucun moyen de faire tout ça via Unity et le C# ?
Je suis d'accord mais !
Ecrire sur un tableau bit par bit , puis envoyé ce tableau aux shader qui va devoir faire des cmp , bof
Techniquement à la place du bit allumé/éteint , on peut écrire un pixel 1 byte (ou sur 2 bytes à la limite pour avoir de la couleur ) et envoyé tout simplement la texture , je suis pas sur que ça changerai des masses niveau perf
J'ai une question : que signifie la mise entre < et > ? Par exemple ici, Color32 :
Je ne trouve aucune documentation à ce sujet.
Code : Sélectionner tout - Visualiser dans une fenêtre à part var data = texture.GetRawTextureData<Color32>();
Merci pour la réponse. Si je comprends bien, c'est une façon de passer un paramètre, ici un type. C'est bien ça ?
J'ai essayé la syntaxe suivante :
où j'ai remplacé var qui ne plaisait pas par le type qui me semblait correspondre : Color32[]. Mais ça ne compile pas. Pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part Color32[] data = texture.GetRawTextureData<Color32>();
Il est au contraire conseillé de garder "var" quand il n'y a pas d'ambiguïté sur le type renvoyé - ce qui est notre cas ici (question de lisibilité globale du code).
Sinon il faut voir la doc de GetRawTextureData : https://docs.unity3d.com/ScriptRefer...xtureData.html
La donnée renvoyée est donc NativeArray<Color32> : https://docs.unity3d.com/ScriptRefer...veArray_1.html
C'est une suite d'octets correspondant au données rvba et pouvant donc être traitée comme un tableau (voir l'exp. avec la doc de GetRawTextureData).
C'est une approche identique à ce qui se fait en C++.
Yves
J"ai essayé la syntaxe suivante :
mais ça n'a pas marché. Donc j'ai essayé d'inclure UnityEngine.CoreModule mais le compilateur me dit qu'il ne trouve pas ce module. Qu'est-ce qu'il se passe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part NativeArray<Color32> data = texture.GetRawTextureData<Color32>();
Autre chose, pour vérifier que j'ai bien compris la syntaxe avec < et > : la ligne suivante :
cherche un composant de type RawTexture dans la liste des composants, je suppose que c'est le premier qui vient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part GetComponent<RawImage>().texture = texture;
La syntaxe avec < et > est elle spécifique à Unity ou est-ce une spécificité du C# ?
Avec using Unity.Collections cela devrait marcher.
Mais utilisez "var" de préférence.
<> correspond bien aux types génériques de C# :
https://docs.microsoft.com/fr-fr/dot...ype-parameters
N'hésitez pas à consulter la doc de Microsoft, très bien faite et en français.
Yves
Avec Unity.Collections, ça marche. Je fais tout ça parce que j'aime bien comprendre correctement ce que j'écris. Le but de ce test était d'éviter d'utiliser le mot var, pour voir ce que l'on pouvait faire de plus rigoureux comme code. Cependant, je suis revenu à la syntaxe avec le mot var car elle simplifie le code, même si je n'aime pas le côté non-explicite du mot var.
Merci Yves pour vos nombreuses réponses et les différents liens que vous m'avez transmis, c'est très instructif.
Il me reste finalement seulement le problème des pixels flous. J'ai vu un composant nommé Pixel Perfect Camera mais je n'ai pas réussi à l'utiliser. Est-ce une piste intéressante ou n'y a-t-il définitivement aucun moyen d'avoir des pixels zoomés nets avec Unity seulement ?
Dans la logique des choses, si l'on veut afficher une "plage" équivalent à plusieurs pixels dans une couleur donnée sans passer par une modification des pixels un à un il faut passez par un affichage vectoriel.
Comme déjà dit cela se fera de façon optimale avec des biblios C++ dédiées en dehors d'Unity sous Visual C++ , Builder C++ et autres…
Cette solution n'est valable que si vous n'envisagez pas de développements plus sophistiqués par la suite, vers la 3D par exp.
En restant sous Unity, comme déjà dit aussi il sera très performant de travailler les shaders, mais assez complexe (perso je n'ai pas eu l'occasion de m'y coller)
Sinon, toujours sous Unity faire appel à un package vectorielle comme "Vector Graphics" ou autres (allez faire un tour aussi dans l'asset store : https://assetstore.unity.com/)
Il faut voir aussi jusqu'à quel point la vitesse est importante en fonction des efforts à faire pour y parvenir…
D'autant qu'Unity arrive maintenant à un niveau de performances très correct (traduction automatique en C++, haut niveau d'optimisation et compilation en code natif sur certaines plateformes comme Android 64) et cela va s'améliorer encore fortement à l'avenir...
Yves
Merci, je m'en vais essayer.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager