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

Qt Discussion :

Calcul des normales dans le vertex shader


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Points : 29
    Points
    29
    Par défaut Calcul des normales dans le vertex shader
    Bonjour a tous,

    J'ai suivit le tuto "La 3D avec le module OpenGL de Qt" (particulièrement la partie 9-C. Utilisation des shaders). Bravo pour ces explications cela m'a permis de débuter avec les shaders.

    Néanmoins j'ai une petite question qui vous semblera peut être bête mais je suis vraiment débutant .....
    La voici :
    - N'ayant pas a ma disposition la carte des normales (image RGB), je les calcul au préalable à partir des dérivés des hauteurs placées dans chaque vertex. Cela fonction plutôt bien. Mais, est il possible de réaliser ce calcul dans le shader_vertex ?

    Car dans le vertex_shader je pondère mes hauteurs par un coeff (applati) :
    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
    #version 130
     
    in vec4 vertex;
    //in vec4 normal;                             ??????? je voudrai le calculer dans le shader ??????????
    //in vec2 texture_coordonnees;
     
    out float color_factor;
    //out vec4 texture_color;
     
     
     
    uniform mat4 modelViewProjection;
    //uniform mat4 matrixpmv;
     
    uniform vec4 light_direction;
    uniform vec4 applati;
     
    //uniform sampler2D texture2d;
     
     
    void main(void)
    {
     
        color_factor = max(dot(normal, light_direction), 0.0);
     
        //texture_color = texture(texture2d, texture_coordonnees.st);
     
        gl_Position = modelViewProjection * (vertex * applati);
    }
    Par avance merci.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 685
    Points
    685
    Par défaut
    Je sais pas très bien ce que tu appelles "dérivé de la hauteur", tu peux préciser ?
    Sinon, dans le tutoriel, les normales sont calculées à partir du produit vectoriel avec 2 vectors qui forment le quadrilatère. Le vertex shader ne permet pas d'accéder aux autres vertex dans une shader (sauf bidouilles contre performantes), donc pas possible de faire cela côté shader.

    Sinon, pour ce genre de question, c'est plus de la 3D/OpenGL, donc va sur le forum 3D, pas sur Qt

  3. #3
    Membre chevronné Avatar de Jbx 2.0b
    Homme Profil pro
    Développeur C++/3D
    Inscrit en
    Septembre 2002
    Messages
    476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur C++/3D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2002
    Messages : 476
    Points : 1 785
    Points
    1 785
    Par défaut
    Comme dit plus bas, le vertex shader est exécuté pour chaque vertex, et on ne peut pas accéder aux vertex voisins. Une solution bancale pourrait être de les placer dans un uniform array mais ce serait contre-performant (plus de data transmit au GPU). Par contre, je ne connais pas dans le détail votre besoin, mais il est possible de le calculer directement depuis la texture. Mieux, il est alors possible de le calculer dans le fragment shader afin de gagner en précision (normale par pixel et non par vertex). A voir si ça peut s'appliquer à votre cas.
    Par exemple si il faut transmettre une texture énorme qui sert pour générer un heightmap c'est pas vraiment utile.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Je sais que le post est ancien,mais peut etre que ma petite réponse apportera une aide aux débutants qui se posent souvent la question : "comment calculer des normales a partir d'un vertex shader".

    c'est normalement impossible...Cependant,si vous avez une version OpenGL supérieure a la 3.0 (je crois que c'est la 3.0,a moins que ça soit la 3.1 ou la 3.2),il y'a un moyen de réaliser ça avec un geometry shader en générant de la géométrie supplementaire,par exemple,a partir de chaque vertex traité par le vertex shader,on demande au geometry shader de générer un triangle,et si on a les 3 vertex d'un triangle ,on peut calculer une normale.

    dans certains cas ça peut résoudre certains de vos problèmes.

Discussions similaires

  1. Comment calculer la position et la normale dans le vertex shader
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 16/04/2013, 00h46

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