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

DirectX Discussion :

VertexPositionColorTexture et shader


Sujet :

DirectX

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut VertexPositionColorTexture et shader
    Bonjour à tous,

    Je suis nouveau dans la programmation de shader. J'ai trouvé un exemple qui permet d'afficher les couleurs et un autre qui permet d'afficher les textures.

    Comment faire pour avoir un shader permettant d'afficher la couleur et la texture avec un degré d'opacitié en utilisant des VertexPositionColorTexture pour la definition de mes vertex (en PS 1.4 VS 1.0) ?


    Merci

    Bye

    Seb

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu pouvais nous montrer ce que tu as déjà essayé, et ce sur quoi tu butes exactement, ça pourrait sûrement nous aider.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Avec les TextureStage tu peut faire ça (sans passer par les shaders) il suffit de moduler les deux. En gros tu peux faire un pixel-shader qui fait la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float4 ps( v2p in ): COLOR0
    {
          float4 color = in.color;
          color *= tex2d( tatexture, in.uv); // Modulation entre la couleur et la texture
          return color; 
    }
    Il y a peut etre des erreures de syntaxe.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci d'essayer de m'aider

    Voici ce que j'ai trouvé pour afficher la couleur :
    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
     
    uniform extern float4x4 WorldViewProj : WORLDVIEWPROJECTION;
     
    struct VS_OUTPUT {
      float4 position : POSITION;
      float4 color : COLOR0;
    };
     
    VS_OUTPUT Transform(
      float4 Pos  : POSITION,
      float4 Color : COLOR0
    ) {
      VS_OUTPUT Out = (VS_OUTPUT)0;
     
      Out.position = mul(Pos, WorldViewProj);
      Out.color = Color;
     
      return Out;
    }
     
     
    technique TransformTechnique {
      pass P0 {
        vertexShader = compile vs_1_0 Transform();
      }
    }
    et le code suivant pour afficher les texture

    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
    uniform extern float4x4 WorldViewProj : WORLDVIEWPROJECTION;
    uniform extern texture UserTexture;
     
    struct VS_OUTPUT
    {
        float4 position  : POSITION;
        float4 textureCoordinate : TEXCOORD0;
    };
     
    sampler textureSampler = sampler_state
    {
        Texture = <UserTexture>;
        mipfilter = LINEAR; 
    };
     
    VS_OUTPUT Transform(
        float4 Position  : POSITION, 
        float4 TextureCoordinate : TEXCOORD0 )
    {
        VS_OUTPUT Out = (VS_OUTPUT)0;
     
        Out.position = mul(Position, WorldViewProj);
        Out.textureCoordinate = TextureCoordinate;
     
        return Out;
    }
     
    float4 ApplyTexture(float2 textureCoordinate : TEXCOORD0) : COLOR
    {
        return tex2D(textureSampler, textureCoordinate).rgba;
    }
     
    technique TransformAndTexture
    {
        pass P0
        {
            vertexShader = compile vs_1_0 Transform();
            pixelShader  = compile ps_1_4 ApplyTexture();
        }
    }

    Donc ce que j'aimerais, c'est combiner les deux exemples, mais je ne sais pas par où commencer...

    Merci

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    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
    uniform extern float4x4 WorldViewProj : WORLDVIEWPROJECTION;
    uniform extern texture UserTexture;
     
    struct VS_OUTPUT
    {
        float4 position  : POSITION;
        float4 color : COLOR0;
        float4 textureCoordinate : TEXCOORD0;
    };
     
    sampler textureSampler = sampler_state
    {
        Texture = <UserTexture>;
        mipfilter = LINEAR; 
    };
     
    VS_OUTPUT Transform(
        float4 Position  : POSITION, 
        float4 Color : COLOR0,
        float4 TextureCoordinate : TEXCOORD0 )
    {
        VS_OUTPUT Out = (VS_OUTPUT)0;
     
        Out.position = mul(Position, WorldViewProj);
        Out.textureCoordinate = TextureCoordinate;
        Out.color = Color;
        return Out;
    }
     
    float4 ApplyTexture(VS_OUTPUT IN) : COLOR
    {
        float4 blend = tex2D(textureSampler, IN.textureCoordinate.xy).rgba;
        blend *= color;
        return blend;
    }
     
    technique TransformAndTexture
    {
        pass P0
        {
            vertexShader = compile vs_1_0 Transform();
            pixelShader  = compile ps_1_4 ApplyTexture();
        }
    }
    En gras les copier/collé de l'effect pour les couleurs seulement en italique le blend des deux couleurs. Au passge, si tu fais une struct pour l'output du vertexshader, c'est mieu de retrouver la même en entrée du pixel shader (bien que pas obligatoire).

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci Blastou
    mais ca bug ... Je vais peut être rajouter le context j'utilise c# avec XNA et ma carte graphique est une vieille ATI 8500 128 Mo. Est-ce que cela fait une difference pour le shader en tant que tel ?


    J'ai aussi ouvert le shader dans FX composer et ca m'indique pour la ligne
    float4 TextureCoordinate : TEXCOORD0 dans VS_OUTPUT Transform :

    Texture3.fx : (20): error X3000: syntax error: unexpected token 'float4'


    Je suis vraiment débutant donc est ce qu'au moins je peux utiliser Nvidia Fx composer avec une carte graphique ATI (Pas sur) ?


    Merci pour ton aide

    Seb

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    J'ai juste copié/collé les deux effects, je n'ai pas fais attention à la syntaxe. FXComposer vas te les donner et les corriger ne vas pas être trop difficile. Là par exemple, tu notes que j'ai zappé une "," après la déclaration du vertex INPUT (je vais l'éditer). Au passage, une remarque, une coordonnée de texture tiens souvent sur des float2 non pas des 4: juste les coordonnées u et v.

    PS : Les shaders c'est portable, même en en assembleur. Par contre je crois qu'ATI à un équivalent a FXComposer, par contre je ne connais plus le nom.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bon ca y est ca marche . Merci beaucoup blastou.
    Il y avait encore une erreur mais j'ai su me débrouiller cette fois-ci.
    J'ai du changer la ligne blend *= Color par blend *= IN.color;

    Effectivement ca marche aussi avec un float2 pour les textures ce qui semble normal.

    Voici le code :


    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
     
    uniform extern float4x4 WorldViewProj : WORLDVIEWPROJECTION;
    uniform extern texture UserTexture;
     
    struct VS_OUTPUT
    {
        float4 position  : POSITION;
        float4 color : COLOR0;
        float4 textureCoordinate : TEXCOORD0;
    };
     
    sampler textureSampler = sampler_state
    {
        Texture = <UserTexture>;
        mipfilter = LINEAR; 
    };
     
    VS_OUTPUT Transform(
        float4 Position  : POSITION, 
        float4 Color : COLOR0,
        float4 TextureCoordinate : TEXCOORD0 )
    {
        VS_OUTPUT Out = (VS_OUTPUT)0;
     
        Out.position = mul(Position, WorldViewProj);
        Out.textureCoordinate = TextureCoordinate;
        Out.color = Color;
        return Out;
    }
     
    float4 ApplyTexture(VS_OUTPUT IN) : COLOR0
    {
        float4 blend = tex2D(textureSampler, IN.textureCoordinate.xy).rgba;
        blend *= IN.color;
        return blend;
    }
     
    technique TransformAndTexture
    {
        pass P0
        {
            vertexShader = compile vs_1_0 Transform();
            pixelShader  = compile ps_1_4 ApplyTexture();
        }
    }
    J'ai encore une autre question. Je voudrais afficher des surface avec et sans texture. Quelle est la meilleur méthode pour gérer ca :

    Avoir deux shader et charger le bon en fonction de ma surface ou avoir un shader qui gère les deux cas (Est ce possible) ??


    Merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Tu peux avoir deux technique dans le même fichier shader surtout que les deux utiliseront le même vertex-shader, seul le pixel-shader change. donc tu fait deux technique du genre :

    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
     
    technique TransformAndTexture
    {
        pass P0
        {
            vertexShader = compile vs_1_0 Transform();
            pixelShader  = compile ps_1_4 ApplyTexture();
        }
    }
     
    technique TransformAndColor {
      pass P0 {
        vertexShader = compile vs_1_0 Transform();
        pixelShader  = compile ps_1_4 ApplyColor();
      }
    }
     
    float4 ApplyColor(VS_OUTPUT IN) : COLOR0
    {
        return IN.color;
    }
    Dans ton code, avant d'afficher ton mesh, il ne te reste plus qu'a "set" la technique que tu veux utiliser.
    Tu peux aussi passer par un if dans ton pixel shader mais les ps_1_4 ne seront plus suffisant, mais je ne vois pas trop l'avantage dans ce cas.

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Citation Envoyé par blastou
    PS : Les shaders c'est portable, même en en assembleur. Par contre je crois qu'ATI à un équivalent a FXComposer, par contre je ne connais plus le nom.
    C'est RenderMonkey, et avec FXComposer, on a deux outils sympas pour faire du shader. Couplé au SDK respectif de ATI et NVIDIA, on trouve des choses très intéressantes.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup tout fonctionne

    Par contre ma texture est à l'envers, mais c'est peut être un problème avec XNA...

    En tout cas MERCI

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

Discussions similaires

  1. Shader distortion texture
    Par Dranor dans le forum DirectX
    Réponses: 13
    Dernier message: 28/07/2004, 21h58
  2. effets de pixel shaders 1.1
    Par cemoi dans le forum DirectX
    Réponses: 11
    Dernier message: 12/12/2003, 15h13
  3. pixel shader 2.0
    Par trois_1 dans le forum DirectX
    Réponses: 3
    Dernier message: 20/10/2003, 15h39
  4. Vertex et Pixel Shader
    Par Riko dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/06/2003, 16h45
  5. carte graphique et pixels shader
    Par yeeep dans le forum DirectX
    Réponses: 2
    Dernier message: 26/04/2003, 10h54

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