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

XNA/Monogame Discussion :

Comment spécifier plusieurs fois, dans un seul SpriteBatch, le même paramètre d'un pixel shader ?


Sujet :

XNA/Monogame

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut Comment spécifier plusieurs fois, dans un seul SpriteBatch, le même paramètre d'un pixel shader ?
    Bonjour,

    Je fais un test avec la class Effect de XNA et j'aimerai spécifier plusieurs fois (une fois par sprite) un parametre passé au shader.

    Voila mon code simplifié pour plus de clarté :

    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
    34
        [...]
        //In Engine class
        Effect ShaderEffect = GameEngine.Instance.Content.Load<Effect>(@"shaders\test");
     
        spriteBatch.Begin(
            SpriteSortMode.Deferred,
            BlendState.AlphaBlend,
            SamplerState.PointWrap,
            DepthStencilState.Default,
            RasterizerState.CullNone,
            ShaderEffect);
     
        [...]
     
        //in drawable class
        foreach(//big loop) {
             ShaderEffect.Parameters["MyParameter"].SetValue(//random vector4);
             spriteBatch.Draw(
                    SpriteSheet,
                    ScreenRect,
                    sprite_to_draw.Rectangle,
                    color,
                    rotation,
                    Scene.getInstance().Camera.Position,
                    sprite_to_draw.SpriteEffect,
                    layer
             );
        }
     
        [...]
     
        //In Engine class
        spriteBatch.End();
        [...]

    Mais sur mon écran je vois bien que le paramètre n'est pas écrasé.

    Y a t'il moyen de contourner cette limitation (si cela en est une, j'ai peut être juste mal compris le système).

    Notez que :

    • En rendu SpriteSortMode.Immediate cela marche correctement mais les performances sont horrible.
    • Si je spécifie un nouveau Begin/End, cela marche mais c'est lent.


    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Apres un changement de paramètre il faut faire un shader.Apply(); il me semble.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Merci pour la réponse.

    Il n'existe hélas pas de méthode Apply sur les shader (Effect : http://msdn.microsoft.com/en-us/libr...tudio.40).aspx) ou sur les EffectParameters (http://msdn.microsoft.com/en-us/libr...tudio.40).aspx).

    La seul fonction qui s'apparante serai onApply qui est protected et ne peut donc etre invoqué depuis l'instance du shader (a supposer qu'elle reapplique le shader).

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    C'était pas loin :

    ShaderEffect.CurrentTechnique.Passes[0].Apply();

    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    J'essairez votre technique ce soir, étes-vous sur que en mode deferred cela marche ?

    J'ai contourné actuellement le pb en hjackant le filtre de couleur envoyé.

    En gros dans le shader je recupere donc color et ses composante R G B A. Chaque composante me donne un offset sur 8 bits (0->255) qui définit ma couleur via un array dans mon shader.

    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
    color_list[0] = float4(0.969, 0.627, 0.145,1) ;     //red hair
    color_list[1] = float4(1, 0.894, 0.173,1) ;         //golden red
    color_list[2] = float4(0.953, 0.953, 0.953,1) ;     //white hair
    color_list[3] = float4(0.1, 0.1, 0.1,1) ;           //black hair
    color_list[4] = float4(0.424, 0.314, 0.082,1) ;     //brown
    color_list[5] = float4(0.5,0.5,0.5,1) ;             //grey
    color_list[6] = float4(1,0.906,0.098,1) ;           //gold
    color_list[7] = float4(0.651, 0.643, 0.584,1) ;     //pure iron
    color_list[8] = float4(0.294, 0.459, 0.6,1) ;       //bluejeans
    color_list[9] = float4(0.714, 0.439, 0.114,1) ;     //leather1
    color_list[10] = float4(0.714, 0.243, 0.114,1) ;    //leather2
    color_list[11] = float4(1, 1, 1,1) ;    //white
    color_list[12] = float4(0.027, 0.49, 0.102,1) ;     //greenpants
    color_list[13] = float4(1,0,0,1) ;                  //red
    color_list[14] = float4(1,1,1,0.3) ;                //ghost
    Ça a l'avantage d’être rapide mais cela limite à 255 couleurs pour 4 parametres.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    On dirai que EffectPass.Apply() n'est pas encore trés mature niveau perf :

    http://xboxforums.create.msdn.com/fo...12/308776.aspx

    Citation Envoyé par Citation de Shawn Hargreaves - Principal Dev Lead at Microsoft
    The Windows EffectPass.Apply implementation in the CTP is not complete, and many optimizations not yet implemented. The CTP implementation is functionally correct, but not from a performance standpoint, so you should not worry too much about Windows performance in the CTP.

  7. #7
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    C'est possible que ça ne fonctionne pas en deferred puisqu'il ne dessinera pas tout de suite.

    Citation Envoyé par CPCHalf Voir le message
    On dirai que EffectPass.Apply() n'est pas encore trés mature niveau perf :
    http://xboxforums.create.msdn.com/fo...12/308776.aspx
    Ils parlent de la CTP ( Community Technology Preview ) rien à voir avec la version actuelle.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Cela ne marche helas pas.

    Ce que vous décrivez est le changement de passe je suppose, mais cela ne recharge pas les paramètres du shader en mode deferred.

    Et sinon une petite image du résultat actuel pour imager . Il y a avec les sprites hors écran traité pour le benchmark 22533 sptires avec un confortable 78 FPS (74 avec avec le impr ecran sur le screen). Il y a 4 couleurs de cheveux et 10 de vetements avec donc un unique sprite de base pour les 'nains'.


  9. #9
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    1- Dans ce cas il ne faut pas se mettre en mode deferred :
    il suffit de trier soit même et d'afficher en immediate.
    2- Lorsque l'on bosse sérieusement sous XNA et que l'on recherche des performances ( ce qui à l'air d'être le cas au vu du screen ) il vaut mieux recoder soit même le spritebatch pour coller au mieux au besoin.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    C'est bien pour cela que j'utilise le mode defered . En immediate mode je chute à 15FPS.

    Refaire un spritebatch m'a déjà été conseillé avec cette ressource : http://gamedev.stackexchange.com/que...ritebatch-work , mais autant j'ai déjà refais les fonctions de rendu de framework opengl comme Slick2D, autant, si j'ai une solution alternative, je préfère ne pas le refaire dans un premier temps sous DirectX pour une question de temps....

    mais...

    ... avec mon détournement de la couleur passé au spritebatch, je ne pourrai pas additionné 2 sources d'éclairage ce qui est un peu nul... donc avez-vous un exemple ou code d’implémentation de spritebatch qui pourrai me faire gagner du temps ?

  11. #11
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Il faut peut être chercher la cause de la baisse du framerate en immédiate : sans doute un overdraw important qui peut etre résolu avec un tri en amont.

    Pour voir efficacement où l'affichage pêche il faut utiliser Pix ( http://en.wikipedia.org/wiki/PIX_(Microsoft) )

    Quel systeme d'éclairage ?

    Sinon non je n'ai pas de code diffusable malheureusement, mais avec une caméra ortho et un shader de base ça devrait aller assez vite
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Je n'ai pas encore essayé PIX, mais pour le mode Immediate il semblerai que cela soit du au Begin/End (mode immediate) appelé pour chaque rendu.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Ici on voit un spriteBatch tres interessant :

    https://github.com/mono/MonoGame/blo...SpriteBatch.cs

    On comprends que Immediate draw a chaque affichage et que pour le reste il y a un setup a la fin puis un draw.

  14. #14
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Dans la mesure où il n'y a pas d'instancing par défaut il y a forcément un appel au Draw par affichage.

    Ce que tu peux voir dans la classe qui s'occupe directement de l'affichage :
    https://github.com/mono/MonoGame/blo...riteBatcher.cs

    Au final tout ce que tu as à faire c'est insérer ton Apply() juste apres la condition du shouldflush.

    Edit : je viens de relire et il dessine plusieurs sprite en meme temps si ils ont la même texture et sont contigus dans la liste ; en recréant un maillage.

    Concretement il y a un nombre limité de parametres qui se répétent, où ils sont souvent tous très différents ?
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2014, 23h11
  2. Réponses: 0
    Dernier message: 22/10/2012, 15h38
  3. [Débutant] comment afficher plusieurs images dans une seule interface ?
    Par youssa81 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 06/02/2009, 00h36
  4. Réponses: 2
    Dernier message: 22/09/2007, 15h37
  5. comment zipper plusieurs fichiers dans un seul
    Par diamonds dans le forum Linux
    Réponses: 4
    Dernier message: 22/03/2007, 20h15

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