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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    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
    Membre à l'essai
    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
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    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
    Membre à l'essai
    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
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 76
    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.

+ 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