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 :

Shader distortion texture


Sujet :

DirectX

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut Shader distortion texture
    Pour un rendu d'eau avec réflection, j'ai implémenté la technique suivante :

    - Retourner la caméra
    - rendre la scene sur une texture
    - projeter la texture sur un quad

    maintenant, comment procéder pour obtenir une distortion dans le mapping de la texture pour simuler un mouvement de vague ?

    L'exemple du FXComposer de NVidia utilise lui une cubemap et une normalmap pour la "distortion" ... mais dans mon cas, j'ai une simple texture 2D....

  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 : 39
    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
    Il faut que tu aies une texture d'offset, et que tu utilises dans ton shader l'instruction texbem pour perturber les coordonnées de texture.
    Si tu veux plus de détaux n'hésite pas.

    Mais attention, c'est une instruction vicieuse et en ce moment par exemple elle me pose pas mal de problèmes (mais sur du hardware récent (> GF3) ça devrait passer sans problème).

  3. #3
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    si tu a des doc explicative sur le sujet ca m'interesse.
    mois j'avait entendu parler de l'utilisation d'une normal map pour calculer la refraction de la lumiere et autre mais je sais pas si c'est si terrible que ca...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  4. #4
    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 : 39
    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
    Bof bof, j'ai jamais vraiment trouvé une bonne doc qui expliquait cette technique, moi-même j'y avais été à l'arrache pour mettre en oeuvre une technique qui marche.

    Si tu veux une petite explication y a pas de problème.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    bon ... va me falloir de l'aide !

    voici le shader que j'utilise :

    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
     
    technique water {
       pass p0 {
          VertexShader = compile vs_1_0 vs_water();
          PixelShader = asm {
     
             //t0 = bumpmap ; t1 = reflect texture
     
             ps_1_1
             tex t0    
             texbem t1, t0 
             mov r0, t1		
          };
       }
    }
    le vertex shader lui s'occupe de la projection de la texture...

    j'active egalement les states suivant (est-ce nécessaire ? )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    device.SamplerState[0].AddressU = TextureAddress.Wrap;
    device.SamplerState[0].AddressV = TextureAddress.Wrap;
    device.TextureState[0].BumpEnvironmentMaterial00 = 0.5f;
    device.TextureState[0].BumpEnvironmentMaterial01 = 0;
    device.TextureState[0].BumpEnvironmentMaterial10 = 0;
    device.TextureState[0].BumpEnvironmentMaterial11 = 0.5f;
     
    device.SamplerState[1].AddressU = TextureAddress.Wrap;
    device.SamplerState[1].AddressV = TextureAddress.Wrap;
    device.TextureState[1].BumpEnvironmentMaterial00 = 1f;
    device.TextureState[1].BumpEnvironmentMaterial01 = 0;
    device.TextureState[1].BumpEnvironmentMaterial10 = 0;
    device.TextureState[1].BumpEnvironmentMaterial11 = 1f;
    seulement ... ça marche pas
    mon plan de réflection n'est qu'un amat de pixel... du "bruit".

  6. #6
    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 : 39
    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
    Les BumpEnvironmentMaterialxx sont nécessaires oui, ils sont utilisés par texbem. En gros voilà ce que ça fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    u += du * M00 + dv * M01
    v += du * M10 + dv * M11
    M est ta matrice BumpEnvironment, (u, v) sont les coordonnées de la texture de reflection, (du, dv) sont les valeurs de ta texture d'offset.
    Par contre je ne sais plus s'il faut la paramètrer sur le stage de la texture d'offset ou celui de la texture de reflet. A vérfier.
    Le wrap ça peut être utilse aussi, puisque sur les bords tes coordonnées de texture vont sortir de [0, 1].

    Ce qui ne va pas, c'est certainement ta texture d'offset. Comme tu as dû le comprendre, les valeurs de cette texture serviront à décaler les UVs de ta texture de reflet. Ce qui veut dire que si tu as un pixel blanc ça te decalera de 1.0 -> ça fait tout le tour de ta texture. Il te faut donc des valeurs très petites, soit dans ta texture soit dans la matrice de bump (mais attention moi j'avais eu des problèmes avec la 2eme option, prefere donc la 1ere si possible !).
    Et je ne sais pas comment ça agit avec des coordonnées de texture 3D comme tu en as certainement si tu fais du projective texturing (moi j'avais une autre technique qui me sortait des coordonnées 2D).
    Un ptit tuyau cependant : les problèmes dont je t'avais parlé se produisent quand tu as des coordonnées 3D héhé

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    ça fonctionne nikel !!! merci beaucoup !

    reste à trouver une jolie texture d'offset.

    pour info c'est les canaux rouge et vert qui sont utilisés et la matrice doit être spécifiée au niveau de la texture de réflection.

  8. #8
    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 : 39
    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
    C'est kewl

    T'as quoi comme carte graphique pour que ça marche aussi bien ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    une radeon 9000 mobility ... et j'ai pas encore essayé sur ma tour (Geforce 4 ti 4200)

  10. #10
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    bon j'ai esayé un truc chez moi mais ca merche pas du tonnerre...
    voila ce que je fait.
    camera a l'envers
    affichage du decors dans une texture
    camera a l'endroit
    affichage de la surface de l'eau avec une texture de buit en niveau de gris dans une texture et avec test stencil
    affichage du decors
    projection d'un quad texturé avec les 2 textures precedentes.

    dans mon pixel shader je calcule les nouvelle coordonnée de lecture de la texture en fonction de la texture de gris (un peut comme de l'offset bump mapping)

    mais bon voila tout ca ca ne me donne pas un resultat super...

    si vous pouviez me donner le principe (de maniere vraiment tehorique car je programme en openGL et je fait mes shader a la main en assembleur ) ca m'interesse...

    merci d'avance
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    à propos, j'obtiens parfois des artefacts avec la projection de ma texture ... des lignes noires.


  12. #12
    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 : 39
    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
    Hmm... où ça des lignes noires ??

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    en bas à droite et en haut au milieu du plan d'eau ... des lignes horizontales noires ...

  14. #14
    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 : 39
    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
    Ah oui desolé (enfin sans coller ma tete contre l'écran là où tu as fait les marques rouges, j'aurais pas vu ; je dois avoir un constraste de merde )

    Sinon euh... je sèche, ça a pas l'air d'un problème typique, ça peut venir de beaucoup de choses je pense.

Discussions similaires

  1. Problème étrange - shader multi texturing
    Par Awakening dans le forum OpenGL
    Réponses: 1
    Dernier message: 20/12/2011, 18h08
  2. Réponses: 2
    Dernier message: 21/09/2009, 20h44
  3. Réponses: 10
    Dernier message: 13/04/2006, 15h54
  4. Réponses: 1
    Dernier message: 06/04/2006, 17h04
  5. Texture + LookUp Table + Shader + extensions
    Par exxos dans le forum OpenGL
    Réponses: 7
    Dernier message: 01/09/2005, 17h14

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