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 :

billboard en GLSL


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut billboard en GLSL
    Bonjours,

    voila j'essaie de faire un billboard d'une sphere en utilisant un caré (je sais c'est un classique ) mais je voudrais surtout comprendre comment ca marche;
    alors ca peut paraitre bizare mais enfaite j'ai trouver un code sur le net qui quand je le teste marche bien, mon probleme de comprehension se situe au niveau de vertex shader, ce vertex shader permet au caré de toujours faire face à la caméra (l'illumination et la modification en sphere etant faites dans le fragment shader), mais voila le probleme c'est que je ne comprend pas comment ce vertex shader permet au caré de faire face à la camera.
    d'aprés ce que j'ai tester le vertice prend en entrée la position du caré (ou de la sphere!), et aussi 4 vertexID (specifiant a tour de role les 4 coin du carée), et aprés transforme les coordonnée de la sphere dans l'espace camera (viewspace) et de la il determine le vertex qui va vraiment etre donnée pour le reste du pipeline, selon le coin representé !
    mais meme si tous cela se passe dans l'espace Camera doit etre la clé du truc, j'arrive pas à me situer et comprendre comment le carée au final fait toujours face à la camera !

    Merci.

    voici le code du vertex :

    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
    46
    47
    attribute float vertexID;         // ID du vertex courant
    out vec2 mapping;               // Mapping de chaque position du Carré dans la sphere
     
    uniform float sphereRadius;     // Rayon de la sphere
    uniform vec3 spherePos;         // Position de la sphere dans le repere Objet
     
    out vec4 cameraSpherePos;  // Position de la sphere (centre) dans le repere Eye
     
    void main()
    {
        vec2 offset;
     
        switch(vertexID)
        {
        case 0:
            //Bas-Gauche
            mapping = vec2(-1.0, -1.0);
            offset = vec2(-sphereRadius, -sphereRadius);
            break;
     
        case 1:
            //Haut-Gauche
            mapping = vec2(-1.0, 1.0);
            offset = vec2(-sphereRadius, sphereRadius);
            break;
     
        case 2:
            //Bas-Droite
            mapping = vec2(1.0, -1.0);
            offset = vec2(sphereRadius, -sphereRadius);
            break;
     
        case 3:
            //Haut-Gauche
            mapping = vec2(1.0, 1.0);
            offset = vec2(sphereRadius, sphereRadius);
            break;
        }
     
        cameraSpherePos = (gl_ModelViewMatrix * vec4(spherePos,1.0));
     
        vec4 cameraCornerPos = cameraSpherePos;
        cameraCornerPos.xy += offset;
     
        gl_Position = gl_ProjectionMatrix * cameraCornerPos;
     
    }

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut
    ehh je pense que j'ai un peu compris en cherchant un peu ! alors vous me corrigez si j'ai tort : mais la camera en Opengl est toujours en (0,0,0) et regarde vers les z negatifs, et donc la camera fait toujours face au plan XY (dans le repere de la camera), donc si une face ou un objet est completement contenu dans le plan XY (donc toutes les vertices de cet objet sont dans le meme plan XY) alors cet objet fera toujours face à la camera, tous ça biensur en étant dans le repere de la camera (viewspace) !!

    voila si quelqu'un pouvais me corrigé si je me suis trompé dans ma comprehension ?

    Merci.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 156
    Billets dans le blog
    151
    Par défaut
    Bonjour,

    Il devient vrai que la caméra se situe toujours en 0 , 0 , 0, mais seulement dans l'espace de la caméra. C'est pourquoi cette ligne est très utile ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cameraSpherePos = (gl_ModelViewMatrix * vec4(spherePos,1.0));
    Cette transformation détermine la position du point dans l'espace de la caméra.
    Ainsi, une fois que cela a été déterminé, on peut appliquer un décalage permettant de déplacer le point face à la camera (qui restera toujours sur le même plan).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 17
    Par défaut
    Merci de la réponse mais pour les imposteur de sphère ca y est c'est fait et ca marche !

    mais voila j'ai un autre problème maintenant enfaite j’utilise les imposteur de sphère pour un petit outil de vision de Molecules en 3D, mais voila maintenant j'ai aussi besoin de faire des imposteur de cylindre, enfaite la technique que j'ai suivit est un peu présenté sur le site de Brad Larson sur ce lien :http://www.sunsetlakesoftware.com/20...g-opengl-es-20

    mais voila j'arrive pas du tout a faire les imposteur pour les cylindre, enfaite j'arrive pas a faire le parallèle de ce que j'ai fait pour les sphère avec les imposteur de cylindre.

    Si je reprend ce que j'ai fait pour les sphère; il fallait d'abord grâce au vertex shader réalisé un carrée qui fait toujours face à la camera puis grâce au fragment shader on fait un lancer de rayon "simple" pour savoir si le fragment appartient ou non à la sphère, puis on calcule la position du fragment courant dans la sphère et la normal à ce fragment afin de calculer la lumière, au final on écrit aussi dans la variable gl_fragdepth afin de donner la bonne profondeur au fragment courant !

    Mais voila le problème est qu'avec la sphère c’était plus simple parce que c’était un objet parfaitement définie mathématiquement ce qui simplifier le calcul des normal et de la position ainsi que des intersection avec les rayon (pour le lancer de rayon) et aussi une autre facilité de la sphère est que quelque soit l'angle de vu on verra toujours la même chose, un simple cercle!

    Et c'est la ou ça se complique pour mon petit cerveaux, c'est que j'arrive pas a voir comment faire un imposteur de cylindre vu que le cylindre n'est pas totalement homogène et qu'avec différent angle de vue on verra différente version du cylindre, donc comment réussir à modéliser ça et à faire après un lancer de rayon qui puisse définir le cylindre et espérer aussi trouver une bonne définition mathématique afin de réussi à calculer la normal pour chaque fragment ?

    Je suis désolé si j'en demande trop mais je suis encore un débutant en 3D et en OpenGL (et encore plus En shader ) et dans ce cas j'arrive pas encore a voir de réel solution. Donc si quelqu'un d'entre vous à une solution à mon problème ou alors une indication merci de m'en faire part s'il vous plait.

    Merci.

Discussions similaires

  1. Rendu de particules et billboarding avec le geometry shader (GLSL)
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 13/10/2014, 22h23
  2. Billboarding dans le Vertex Shader (GLSL)
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 29/09/2014, 19h55
  3. [GLSL] Billboarding et particules
    Par coda_blank dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/06/2010, 00h37
  4. Billboarding
    Par DeusXL dans le forum DirectX
    Réponses: 1
    Dernier message: 01/05/2004, 18h39

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