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

OpenGL Discussion :

[GLSL] Parallax mapping


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut [GLSL] Parallax mapping
    Hello.

    J'essaye de faire du parallax mapping mais ça ne semble fonctionner que quand la caméra est dans certaine position ! pourquoi ?

    Si je définit ma caméra comme ceci :
    gluLookAt(eye.x, eye.y, eye.z, dir.x, dir.y, dir.z, top.x, top.y, top.z);
    est-ce que le vecteur de vue que je doit envoyer à mon fragment shader est-il égal à normalize(dir-eye) ?

    Voici le code du vertex shader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void main()
    {
    	gl_TexCoord[0] = gl_MultiTexCoord0;
    	gl_Position = ftransform();
    }
    Et le code du fragment shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uniform sampler2D diffuseTexture;	//diffuse texture
    uniform sampler2D heightMap;		//height map
     
    uniform vec3 viewVector; //dir-eye
     
    void main()
    {
    	float height = texture2D(heightMap, gl_TexCoord[0].st).r;
    	float displacement = (height * 0.04) - 0.02;
    	vec2 newTexCoord = vec2((normalize(viewVector) * displacement)) + gl_TexCoord[0].st;
     
    	gl_FragColor = texture2D(diffuseTexture, newTexCoord);
    }
    Edit : Est-ce que le "parallax mapping" et le "parallax occlusion mapping" sont la même chose ?

    merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    ton code ne ressemble pas du tout a un code de parallax mapping.

    L'idee du parallax mapping, c'est de lancer un rayon pour chaque pixel d une surface a partir de l oeil. Il s'agit alors, pour le triangle concerne de trouver un decalage des coordonnees de texture due a fait que le triangle n'est pas plat mais bossele (texture d elevation) et le rayon peut donc etre intercepte.

    Il s agit donc de faire plusieurs lecture de la texture d elevation pour trouver a quel moment le rayon est intercepte (deja tu n en fait qu une seule)

    Ensuite, pour travailler correctement, il faut commencer par trouver ton rayon :

    ce rayon est finalement le vecteur qui par du centre de l oeil vers le sommet du triangle (tu le calcul au niveau du vertex shader , et tu peux le retrouver dans ton fragment par interpolation -> il s agit donc d'un varying et pas d un uniforme). Ce que tu utilises c 'est la direction global de ta camera qui est finalement le rayon qui part de l oeil droit devant ... ce rayon est constant sur toute la scene !!!)

    note : il faut veiller a exprimer ce rayon dans le repere local a la surface . on utilise pour cela le tangeant space (mots cles tangeant , normal et binormal)

    Si tu veux de bon exemples, tu dois pouvoir en trouver sur les SDK nvidia ou ATI.

    Si tu as RenderMonkey (chez ati) , je peux te transmettre un exemple que j aui fait.




    Quant au parallax occlusion mapping, il s agit de trouver les ombres qu'une surface bosselee produits sur elle meme (meme probleme d intersection avec un rayon qui par d un point de la surface vers la source lumineuse)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Merci bien,

    C'est vrai que j'ai en peu merdé pour mon vecteur mais maintenant je pense qu'il est bon :

    Vertex shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    varying vec3 viewVector;
    uniform vec3 eye; //position de l'oeil
    void main()
    {
    	viewVector = normalize(ftransform().xyz - eye);
     
    	gl_TexCoord[0] = gl_MultiTexCoord0;
    	gl_Position = ftransform();
    }
    Par contre pour le reste, c'est encore assez flou dans ma tête, pourrais-tu m'envoyer l'exemple que tu as fait ? petitg1987 [a] gmail.com, merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Par défaut
    Gloups, j'ai oublié l'espace local dans tout ça. J'ai aussi trouvé un fragment shader sur le net et re-voici mon nouveau code:

    vertex 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
    varying vec3 viewVector;
    uniform vec3 eye;
    attribute vec3 tangent;
     
    void main()
    {
    	//local space
    	vec3 n = normalize(gl_NormalMatrix * gl_Normal);
    	vec3 t = normalize(gl_NormalMatrix * tangent);
    	vec3 b = cross(n, t);
     
    	vec3 tmpViewVector = normalize(ftransform().xyz - eye);
     
    	viewVector.x = dot(tmpViewVector, t);
    	viewVector.y = dot(tmpViewVector, b);
    	viewVector.z = dot(tmpViewVector, n);
     
    	gl_TexCoord[0] = gl_MultiTexCoord0;
    	gl_Position = ftransform();
    }
    fragment program:
    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
    varying vec3 viewVector;
    uniform sampler2D diffuseTexture;	//diffuse texture
    uniform sampler2D heightMap;		//height map
     
    void main()
    {	
    	float fDepth = texture2D(heightMap, gl_TexCoord[0].st).r;
    	vec2 vHalfOffset = normalize(viewVector).xy * (fDepth) * 0.05;
     
    	fDepth = (fDepth + texture2D(heightMap, gl_TexCoord[0].st + vHalfOffset).r) * 0.5;
    	vHalfOffset = normalize(viewVector).xy * (fDepth) * 0.05;
     
    	fDepth = (fDepth + texture2D(heightMap, gl_TexCoord[0].st + vHalfOffset).r) * 0.5;
    	vHalfOffset = normalize(viewVector).xy * (fDepth) * 0.05;	
     
    	gl_FragColor = texture2D(diffuseTexture, gl_TexCoord[0].st + vHalfOffset);
    }
    Biensur, le résultat n'est pas correcte

Discussions similaires

  1. [OpenGL] Bump et parallax mapping
    Par victor_gasgas dans le forum OpenGL
    Réponses: 3
    Dernier message: 07/01/2011, 12h53
  2. Réponses: 1
    Dernier message: 12/05/2008, 23h09
  3. [GLSL] Probleme de bump mapping
    Par drcd dans le forum OpenGL
    Réponses: 9
    Dernier message: 08/02/2008, 11h53
  4. parallax mapping : problème
    Par casafa dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 10/12/2007, 08h51
  5. [3D] parallax mapping
    Par derferic dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 17/02/2006, 13h44

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