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 :

Lumieres vs normales


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Lumieres vs normales
    Bonjour a tous =)

    J'ai un petit probleme dans mon application 3D concernant l'ajout de lumieres opengl. En effet, mes meshes .obj sont tres mal eclaires, que ce soit une sphere, un cube ou un monkey.

    [Screen du bug]
    [Screen du bug]


    Mes normales de vertex sont importees depuis le fichier obj et sont stockees dans un VBO.
    Je peux fournir du code au besoin.

    Quelques questions :
    - Les vertex normals sont bien supportees par glNormalPointer() ?
    - Est-il necessaire de calculer les normales par face, dans quel cas sont-elles utilisees ?
    - Le code d'initialisation des lumieres est-il correct ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    glEnable(GL_LIGHTING);
    glEnable(GL_DEPTH_TEST);
     
    GLfloat matAmbient[] = {1.f,1.f,1.f,1.f};
    GLfloat matDiffuse[] = {1.f,1.f,1.f,1.f};
     
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
     
    GLfloat positionLight[] = {0.f, 0.f, 5.0f, 0.0f};
    glLightfv(GL_LIGHT0, GL_POSITION, positionLight);
     
    glEnable(GL_LIGHT0);
    (Desole pour l'absence d'accents, mon clavier a quelques soucis lui aussi ^^)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu ne donne pas de couleur à ta lumière ? Par défaut la lumière 0 est très sombre.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Bin oui je peux modifier la couleur de la lumiere, mais il me semble que le probleme ne vient pas de la...
    J'ai toujours des artefacts un peu partout sur mon mesh...

    Et j'ai pourtant verifie mes normales, ca m'a l'air assez bon de ce cote...
    Bizarre.

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Donne le code qui copie les normales de ton obj vers les vbos.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ouep, pas de probleme :

    Alors voici les structures que j'utilise (avec la SFML)
    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
    struct Vertex
    {
        sf::Uint32      normal;
        ...
    };
     
    typedef std::vector<sf::Uint32>         Indexes;
    typedef std::vector<Vertex>             Vertices;
    typedef std::vector<sf::Vector3f>       Normals;
     
    class MeshBuffer
    {
        public:
            MeshBuffer();
     
            Vertices&           GetVertices();
            Normals&            GetNormals();
            Indexes&            GetIndexes();
     
        private:
            Vertices            myVertices;
            Normals             myNormals;
            Indexes             myIndexes;
    };
    Parsing des normales (vn 1.0 0.0 0.0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const sf::Vector3f& vn = GetVectorFromLine(line);
    meshBuffer->GetNormals().push_back(vn);
    Parsing des faces (f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // je recupere le vertex associe a son index
    Vertex& vertex = meshBuffer->GetVertices()[vIndex];
    // je recupere l'index de la normale (-1 bien sur)
    sf::Uint32 vnIndex = Utils::GetFromString<sf::Uint32>(vnIndexStr, 0) - 1;
    vertex.normal = vnIndex;
    Remplissage du VBO
    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
    // Il y a autant de normales que de vertex (*3 pour chaque composante flottante)
    sf::Uint32 normalSize = myIndexes.size() * 3;
     
    // on declare le tableau pour notre vbo
    glBindBuffer(GL_ARRAY_BUFFER, myNormalBufferID);
    glBufferData(GL_ARRAY_BUFFER, normalSize * sizeof(float), NULL, GL_DYNAMIC_DRAW);
    float* normals = new float[normalSize];
     
    sf::Uint32 n = 0;
    // on itere sur chaque index pour remplir notre tableau de normales
    for (Indexes::iterator it = myIndexes.begin(); it != myIndexes.end(); ++it)
    {
        Vertex& v = myVertices[*it];
        const sf::Vector3f& normal = myNormals[v.normal];
        normals[n + 0] = normal.x;
        normals[n + 1] = normal.y;
        normals[n + 2] = normal.z;
        n += 3;
    }
     
    glBufferSubData(GL_ARRAY_BUFFER, 0, normalSize * sizeof(float), normals);
    Le parsing ne pose pas de probleme, j'ai verifie. Par contre il se peut que je me trompes quand au remplissage du vbo

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Comment utilises-tu le VBO dans le code d'affichage?

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

Discussions similaires

  1. Cube, normales et lumieres
    Par Deus Ex Makina dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/04/2005, 09h16
  2. Un peu de lumière sur l'arborescence des fichiers de Linux
    Par Noki dans le forum Administration système
    Réponses: 6
    Dernier message: 07/04/2004, 16h16
  3. probleme de normales + lighting
    Par Daedar dans le forum OpenGL
    Réponses: 13
    Dernier message: 24/03/2004, 09h04
  4. [light] Comment fait-on une lumiere constante ?
    Par :GREG: dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/03/2004, 17h54

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