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 :

Flou et radiance


Sujet :

XNA/Monogame

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut Flou et radiance
    Bonjour
    Je cherche deux choses mais malgré une journée de recherche je ne trouve rien de convainquant. J'ai vraiment l'impression que XNA n'est pas énormément documenté.
    1°) Je voudrais afficher un fond (basé sur une Texture2D) en flou. Comment faire ? Un shader ? Un élément entre la "caméra" et le fond ?
    2°)Je voudrais afficher un élément avec un effet de "glow" autours. Les exemples que je trouvent affichent le glow pour la totalité de la scène mais pas sur un seul élément.
    Voici l'effet que je cherche à reproduire :

    Des idées ?

  2. #2
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Salut Kaneda Shotaro !

    Pour XNA ce n'est pas que ce n'est pas bien documenté mais c'est qu'il faut savoir ou chercher !

    Donc deux bon endroits, le site AppHub (anciennement XNA Developer Club) et le site Codeplex à la section XNA.

    Pour le glow j'ai trouvé ça : Glow Effect

    Pour le fond je vois pas trop ce que tu veux faire ...

  3. #3
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup ! Je vais regarder ça !
    Pour le fond je voudrais faire ce genre d'effet :

  4. #4
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Apparement les fichiers d'effet (.fx) ne sont pas d'actualité : ça ne compile pas.

    ps_1_x is no longer supported
    unexpected token 'PixelShader'
    etc

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut Kaneda ;

    C'est parce que tu compiles les shaders en 1_1 , essaie en 2_0 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    VertexShader = compile vs_2_0 VS();
    PixelShader = compile ps_2_0 PS();
    Salutations.

  6. #6
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Merci
    Ca resoud effectivement une partie des problèmes mais j'ai toujours "unexpected token 'PixelShader'"

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Kaneda ,

    C'est une erreur de syntaxe, PixelShader est un mot reservé donc aucune fonction ne doit avoir ce nom. Sinon note la ligne d'erreur et montre-moi le reste du code hlsl.

    Salutations.

  8. #8
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Voici le contenu du fichier fx :
    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
    35
    36
    37
    38
    // GaussianBlur.fx 
     
    // #######################
    // ##### PARAMENTERS #####
     
    sampler TextureSampler : register(s0);
     
    #define SAMPLE_COUNT 7
     
    float2 SampleOffsets[SAMPLE_COUNT];
    float SampleWeights[SAMPLE_COUNT];
     
    // #######################
    // ##### PIXELSHADER #####
     
    float4 PixelShader(float2 texCoord : TEXCOORD0) : COLOR0
    {
        float4 c = 0;
     
        // Combine a number of weighted image filter taps.
        for (int i = 0; i < SAMPLE_COUNT; i++)
        {
            c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i];
        }
     
        return c;
    }
     
    // #######################
    // ##### TECHNIQUES ######
     
    technique GaussianBlur
    {
        pass Pass1
        {
            PixelShader = compile ps_2_0 PixelShader();
        }
    }
    L'erreur se situe ligne 16

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut Kaneda,

    Pour le flou(blur) il y un exemple ici avec une classe GaussianBlur réutilisable:
    http://www.dhpoware.com/demos/xnaGaussianBlur.html

    mais on peut simplement créer un petit effet avec ce shader:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
     
    float4x4 World;
    float4x4 View;
    float4x4 Projection;
    Texture2D ShaderTexture;
     
    sampler TextureSampler = 
    sampler_state 
    { 
     texture = <ShaderTexture> ;
     magfilter = LINEAR;
     minfilter = LINEAR;
     mipfilter= LINEAR;
     AddressU = wrap;
     AddressV = wrap;
    };
     
    struct VertexShaderInput
    {
        float4 Position : POSITION0;
        float2 TEXCOORD: TEXCOORD0;
    };
     
    struct VertexShaderOutput
    {
        float4 Position : POSITION0;
        float2 TEXCOORD: TEXCOORD0;
    };
    VertexShaderOutput  VertexShaderFunction(VertexShaderInput input)
    {
        VertexShaderOutput output;
     
        float4 worldPosition = mul(input.Position, World);
        float4 viewPosition = mul(worldPosition, View);
        output.Position = mul(viewPosition, Projection);
        output.TEXCOORD = input.TEXCOORD;
     
        return output;
    }
    float4 PixelShaderBlur(VertexShaderOutput input) : COLOR0
    {
     float4 Color;
     Color = tex2D(TextureSampler, input.TEXCOORD.xy);
     Color += tex2D(TextureSampler, input.TEXCOORD.xy + (0.01));
     Color += tex2D(TextureSampler, input.TEXCOORD.xy - (0.01));
     Color = Color / 3;
     return Color;
    }
    technique Blur
    {
        pass Pass1
        {
            VertexShader = compile vs_2_0 VertexShaderFunction();
            PixelShader = compile ps_2_0 PixelShaderBlur();
        }
    }
    Pour le glow,il y a cet exemple:

    http://create.msdn.com/en-US/educati...g/sample/bloom

    Il s'appelle bloom, mais on m'a toujours dit que le glow est un bloom plus évolué. A confirmé par d'autres, je ne suis pas spécialiste. Sinon tu devrais trouver d'autres exemples de 'vrai' glow.

    Salutations.

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Kaneda,

    C'est bien ce que je disais , renomme ta fonction en PS() (ou autre) et non PixelShader,mot réservé.

    Salutations.

  11. #11
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Parfait pour le GaussianBlur ! Je vais tester ça !
    Par contre pour le glow :
    En renommant les fonctions autre erreur : le type ResolveTexture2D n'existe plus.

    Pour l'exemple Bloom je l'avais vu mais il applique un glow général et non sur un objet en particulier donc je sais pas trop. Je vais essayer quand même

    Un grand merci en tous les cas !

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Kaneda,

    ResolveTexture2D n'est plus supporté, il faut utiliser RenderTarget2D (avec SetRenderTarget).

    http://blogs.msdn.com/b/shawnhar/arc...tudio-4-0.aspx

    Salutations.

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Kaneda,

    Dans l'exemple on 'bloom' tous les éléments en full screen mais rien ne t'empèche de le faire que pour certains sprites et pas d'autres, analyse un peu le code et tu verras. Par exemple dans le draw de BloomPostprocessGame si tu dessines comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
                base.Draw(gameTime);
                device.DepthStencilState = DepthStencilState.Default;
                DrawModel(gameTime);
    le tank ne subira pas de bloom.

    Salutations.

  14. #14
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Un immense merci !!!! Je vais bosser dessus demain et je mets "résolu" dès que tout est ok.
    Grâce à vous deux j'ai vraiment bien avancé !!!!

  15. #15
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Ravi d'avoir pu aider !

    Désolé de ne pas avoir précisé que le glow était en XNA 3.1 et non pas 4 et donc il fallait faire un petit travail de convertion.

  16. #16
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Pour le flou : nickel !
    Pour le bloom : presque nickel. Il me l'applique partout malgré le p_Game.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

    Je cherche comment sélectionner les modèles sur lesquels l'appliquer ou non

    Edit : J'ai compris ! Tout ce qui est dessiné après le base.Draw() n'est pas affecté par le bloom !

  17. #17
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Ca me pose quand même un problème : normalement j'affiche au fur et à mesure les éléments du fond aux éléments du premier plan mais là ça m'empêche cette technique

  18. #18
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut Kaneda,

    C'est normal car base.draw appelle le draw de bloom qui est un drawablegamecomponent et l'appel se fait because cette instruction: Components.Add(bloom);
    On peut bidouiller en faisant ceci:

    dans le constructeur de BloomPostprocessGame:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     bloom.Initialize();
     //Components.Add(bloom);
    dans le draw de BloomPostprocessGame après spriteBatch.End:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     spriteBatch.End();
     if (bloom.Visible) bloom.Draw(gameTime);
    dans la classe BloomComponent on remplace 'protected override' par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     public void Draw(GameTime gameTime)
    Donc le tank ne sera pas modifié car il n'est pas entre bloom.BeginDraw et
    bloom.Draw.Tu as loisir de choisir le sprite qui sera "bloomé".
    Par exemple si après bloom.Draw on colle ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        spriteBatch.Begin(0, BlendState.Opaque);
        spriteBatch.Draw(background, new Rectangle(0, 0, viewport.Width / 2, viewport.Height / 2), Color.White);
        spriteBatch.End();
    le sprite en haut à gauche ne sera pas modifié.

    Mais bon,c'est du bidouillage, il vaut mieux réécrire le tout proprement.

    Salutations.

  19. #19
    Membre du Club
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Points : 60
    Points
    60
    Par défaut
    Oui c'est ce que j'avais fait. J'ai même créé une classe de sprite dans laquelle j'ai intégré cet effet. Ainsi je peux gérer les effets sprite par sprite.

    Merci beaucoup ! Je marque ce sujet comme résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Flou radial - Effet de zoom
    Par cyber_N dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 07/10/2008, 18h20
  2. Algo de recherche de flou
    Par Joeleclems dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/03/2005, 10h19
  3. Réponses: 4
    Dernier message: 25/12/2004, 01h03
  4. Problème écran flou
    Par freums dans le forum Matériel
    Réponses: 14
    Dernier message: 06/07/2004, 18h57
  5. recherche filtre flou gaussien
    Par gimlithedwarf dans le forum Langage
    Réponses: 4
    Dernier message: 01/08/2002, 22h32

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