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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    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
    Par défaut
    Apres un changement de paramètre il faut faire un shader.Apply(); il me semble.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    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
    Par défaut
    C'était pas loin :

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


  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    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 averti
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 22
    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.

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