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 :

Utiliser un unique Cube map pour plusieurs objets (réfraction)?


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut Utiliser un unique Cube map pour plusieurs objets (réfraction)?
    Bonjour,

    j'essaie de simuler la réfraction de verres de lunettes en utilisant la combinaison cube map + shaders telle qu'elle est décrite dans l' "Orange book" (et un peu partout ailleurs sur le net).

    Mon application utilise un arrière plan "fixe", quelle que soit la position de la caméra. J'utilise pour ce plan la texture "NegativeZ" de mon cube map. Les 5 autres textures de mon cube map sont utilisées pour les réflections / refractions, mais jamais directement visibles.

    Afin de tester, je remplace mes verres par de simples Quads dans le plan (XY) (la direction de vue est -Z). Dans un premier temps pas de réfraction, je veux juste simuler une transparence comme on pourrait le faire en utilisant le blending (pour cela, dans mon shader, j'utilise le vecteur incident à la place du vecteur refracté pour effectuer le lookup dans le cube map). Je fais ca pour m'assurer que mon cube map est bien "configuré" avant de rajouter la vraie réfraction. Mais déjà là je rencontre des problèmes

    - 1) Si mon quad est centré en (0,0,-50) (la caméra étant en (0,0,0), la pseudo-refraction est correcte quelle que soit la taille du quad (image 1)

    - 2) Si je place 2 quads à peu près à la position de mes verres, c'est à dire excentrés, j'observe des erreurs (image 2).

    Je pense que, pour avoir un rendu correct, il me faudrait calculer deux cube map différents, chacun pris depuis le verre correspondant. Cependant j'aimerais utiliser un cube map statique, pas le calculer dynamiquement vu que de toute facon mon arriere-plan reste fixe.

    J'ai essayé d'ajouter un vecteur aux vecteurs réflechis et réfractés, pour tenir compte de la position de départ du rayon (qui sinon part toujours du centre du cube) mais ca ne marche pas correctement.

    Mes questions:
    - Est-il avant tout possible d'atteindre le résultat que je souhaite en utilisant un seul cube map pour les différents objets de ma scène?
    - Y a-t-il peut-être une autre manière plus simple d'y arriver (autre que le ray-tracing dans un premier temps) ?

    Un autre problème:
    - dans le cas 1), c'est ok tant que le quad reste perpendiculaire à ma direction de vue. Dès qu'il se met à tourner le résultat est incorrect: vu que j'ai une réfraction nulle, je devrais pouvoir observer l'arriere plan tel quel, quelle que soit l'orientation de mon quad (ma vitre si vous préférez)....à la place j'ai ce que l'on voit dans l'image 3...des idées?

    Merci d'avance, en espérant que c'est assez clair....

  2. #2
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    on pourrait en savoir plus sur les maths que tu utilises ?

    Sinon la lecture dans une cube map est "une forme" de raytracing. La simplification est que la cube map est censée représenter un environnement à l'infini (pas de parallaxe). D'ailleurs de manière générale il faut évaluer le rayon sortant par pixel pour limiter les artefacts.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  3. #3
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Salut Greg, et merci de te pencher sur mon problème!

    Pour les maths et autres détails:

    1) Les quads: coordonées (+-20,+-20, 0), translatés en (-30,0,-50) et (30, 0,-50) (image 2) ou juste en (0,0,-50) (image 1 - les deux sont donc superposés mais qu'importe).
    2) Point de vue: en (0,0,0), regardant selon l'axe -Z

    3) Vertex shader: je fais les transformations "classiques" qui suivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Clip-space transformation
    gl_Position = ftransform();	
     
    // Eye-space transformations
    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;	// Homogeneous point
    ecPosition3 = (vec3(ecPosition)) / ecPosition.w; 
     
    // Normal transformation
    normal = gl_NormalMatrix * gl_Normal;				// Get normal
     
    // Texture coordinates transformation
    gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_TextureMatrix[1] * gl_MultiTexCoord1;
    puis je calcule mes rayons reflechis / réfractés comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    vec3 i = normalize(ecPosition3);
    vec3 n = normalize(normal);
     
    reflectDir = reflect(i, n);
    reflectDir = vec3(gl_TextureMatrix[0] * vec4(reflectDir, 1.0));
     
    refractDir = refract(i, n, Eta);
    refractDir = vec3(gl_TextureMatrix[0] * vec4 (refractDir, 1.0));
    NOTE: pour mon test de "réfraction nulle" j'utilise
    , ce qui devrait avoir le même effet que Eta = 1

    4) Fragment shader: outre les calculs d'eclairage et compagnie, je récupère les couleurs de mes rayons réfléchis et réfractés comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    vec3 reflectColor 	= vec3(textureCube(EnvMap, reflectDir));
    vec3 refractColor = vec3(textureCube(EnvMap, refractDir));
    Voilà pour le code! Un détail qui, à mon avis, a son importance: si je n'utilise que le rayon réfléchit, j'obtiens les même résultats qu'en faisant de la réflexion avec la "partie fixe" d'OpenGL. Là aussi j'observe les erreurs montrées sur l'image 2 (sauf qu'a la place d'une grille bleue je vois la grille oange de ma texture PosZ, qui est réfléchie).
    Je pense donc que mes maths sont correctes (mais bien sûr je peux me tromper) et qu'il me faut appliquer un vecteur de correction aux rayons réfléchis / réfractés pour qu'ils ne partent pas du centre du cube, qui est le centre de ma scene, mais des points correspondants à leur position sur mes quads. Hum..encore une fois j'espere que ca reste suffisament clair....

  4. #4
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    J'ai trouvé d'où venait mon problème montré sur l'image 2:
    - j'utilisais 2 quads, chacun ayant 4 sommets. Comme les rayons réfléchis / réfractés sont calculés par vertex, je n'avais pas assez de sommets pour éviter que l'interpolation n'introduise des erreurs. Je viens de tester en remplacant les quads par des grilles de 40*40 quads et ca marche sans problème!

    Reste le second problème évoqué à la fin de mon premier post, à savoir que quand mes quads tournent l'image réfractée ne correspond plus à l'arrière plan, alors que j'utilise une réfraction "nulle".

    Voilà je vais chercher ce qui cloche à ce niveau là...désolé de poser des questions auxquelles je réponds 2 jours plus tard...mais bon peut être qu'un de ces 4 ca servira à quelqu'un

  5. #5
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    petite update pour ceux interessés par le sujet: j'ai enfin réussi à faire tourner l'ensemble correctement.

    Le problème était dû à la position de ma scène: OpenGL considérant "l'oeil" comme étant en (0,0,0). Il fallait donc que je décale l'ensemble de ma scène pour simuler la direction de vue voulue.

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

Discussions similaires

  1. Utiliser une animation en Resources pour plusieurs TargetName
    Par marcusien dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 27/03/2012, 11h29
  2. Réponses: 2
    Dernier message: 04/05/2011, 15h55
  3. [WD-2000] une seule fonction pour plusieurs objets
    Par olivier.pz dans le forum VBA Word
    Réponses: 3
    Dernier message: 18/01/2011, 15h52
  4. Réponses: 3
    Dernier message: 12/02/2009, 16h44
  5. Handles pour plusieurs objet
    Par Ornitho76 dans le forum VB.NET
    Réponses: 1
    Dernier message: 17/12/2008, 17h03

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