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 :

per vertex glMaterial


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut per vertex glMaterial
    Bonjour à tous,

    Je rencontre quelques difficulté avec glMaterial. D'après La doc, on peut spécifier un glMaterial par vertex:
    glMaterial can be called between a call to glBegin and the corresponding call to glEnd
    J'ai donc ce code:
    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
     
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glDisable(GL_COLOR_MATERIAL);
     
    glBegin(GL_TRIANGLES);
     
    GLfloat mat_diffuse1[] = { 1.0, 0.0, 0.0, 1.0 };
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
    glVertex3f(0, 0, 0);
     
    GLfloat mat_diffuse2[] = { 0.0, 1.0, 0.0, 1.0 };
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse2);
    glVertex3f(1, 0, 0);
     
    GLfloat mat_diffuse3[] = { 0.0, 0.0, 1.0, 1.0 };
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse3);
    glVertex3f(1, 1, 0);
     
    glEnd();
    Et les shader suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // vertex
    void main(){ 
      gl_Position = ftransform(); 
    }
     
    // fragment
    void main(){ 
      gl_FragColor = gl_FrontMaterial.diffuse; 
    }
    Qui est censé afficher un triangle avec des coins rouges, verts et bleus, mais je n'obtiens qu'un triangle rouge (couleur du 1er vertex). Suis-je un boulet ou est-ce un bug de driver ? J'aimerais avoir vos avis (et même si quelqu'un pouvait tester chez lui ça serait super )

    Config: win7, GeForce 285, drivers 285.2

    Merci.

    Note: Je sais qu'il s'agit de fonctions deprecated/préhitoriques, mais c'est du vieux code et faut bien faire avec...

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Par défaut
    Salut

    Même si mes connaissances en informatique et programmation graphique sont très limitées, je voulais juste te dire que ce bout de code fonctionne parfaitement chez moi :

    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
    48
    49
    50
    51
    52
     
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
     
    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Mon premier programme OpenGL !",NULL);
        SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
     
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glDisable(GL_COLOR_MATERIAL);
     
        bool continuer = true;
        SDL_Event event;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = false;
            }
     
            glClear(GL_COLOR_BUFFER_BIT);
            glBegin(GL_TRIANGLES);
     
            GLfloat mat_diffuse1[] = { 1.0, 0.0, 0.0, 1.0 };
            glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse1);
            glVertex3f(0, 0, 0);
     
            GLfloat mat_diffuse2[] = { 0.0, 1.0, 0.0, 1.0 };
            glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse2);
            glVertex3f(1, 0, 0);
     
            GLfloat mat_diffuse3[] = { 0.0, 0.0, 1.0, 1.0 };
            glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse3);
            glVertex3f(1, 1, 0);
     
            glEnd();
     
            glFlush();
            SDL_GL_SwapBuffers();
        }
     
        SDL_Quit();
     
        return 0;
    }
    J'obtiens un triangle aux sommets rouge, vert et bleu comme tu l'espérait. Par contre je ne pourrai pas te renseigner sur l'origine de ton problème car je n'y connais pas grand chose

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

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

    ca pourrait être un problème de Shading model. Extrait de l'OpenGL Programming guide:
    With flat shading, the color of one vertex of a primitive is duplicated across all the primitive's vertices. With smooth shading, the color at each vertex is treated individually. For a line primitive, the colors along the line segment are interpolated between the vertex colors. For a polygon primitive, the colors for the interior of the polygon are interpolated between the vertex colors
    Dans ton cas il faudrait utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glShadeModel (GL_SMOOTH);
    Ce qui m'intrigue c'est que c'est le mode par défaut, donc à moins que tu ne le changes explicitement à GL_FLAT quelque part, ca devrait déjà marcher...

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    @ShevchenKik
    Bien vue, mais non. Même avec GL_SMOOTH ça ne marche pas

    @Lintel-oo
    Merci d'avoir testé. Sans shaders ça marche aussi chez moi, mais apparement c'est le passage du gl_FrontMaterial qui ne se fait pas par vertex.

    Une chose m'étonne par contre, dans les spec gl_FrontMaterial est déclaré comme uniform. Comment pourrait-on alors avoir un gl_FrontMaterial interpolé entre les vertexes ?...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Re,

    désolé je n'avais pas du tout fait gaffe que le problème était lié aux shaders. Du coup ca me rassure que ca marche en mode fixe, ca au moins c'est logique

    Pour les shaders, ca fait un bail que je n'y ai plus touché donc mes connaissances ne sont pas au top, néanmoins:
    - Dans ton vertex shader, tu ne calcules que la position de ton vertex, je pense qu'il faut également définir une couleur à cet endroit là pour que cette dernière puisse être interpolée AVANT que le fragment shader ne soit exécuté pour chaque pixel.

    En gros, et en simplifiant (sans éclairage), j'essaerais un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // vertex
    void main(){ 
      gl_Position = ftransform(); 
     
    gl_FrontColor = gl_FrontMaterial.diffuse;
     
    }
     
    // fragment
    void main(){ 
      gl_FragColor = gl_Color;
    }
    Voilà comme dit c'est une piste "sans garantie", que les experts d'OpenGL > 2.0 se manifestent si je raconte des c...

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Non plus... J'ai essayé aussi en utilisant un varying à moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // vertex
    varying vec4 color;
    void main(){ 
      gl_Position = ftransform(); 
      color = gl_FrontMaterial.diffuse;
    }
     
    //fragment
    varying vec4 color;
    void main(){ 
      gl_FragColor = color;
    }
    Marche ça ne marche pas. gl_FrontMaterial reste désespérément à la valeur qu'il avait juste avant le glBegin().

    En attendant je vais me caler sur le gl_Color, lui au moins est bon...

Discussions similaires

  1. Tableau de vertex dans OpenGL
    Par Guizmo57 dans le forum OpenGL
    Réponses: 5
    Dernier message: 11/04/2004, 10h15
  2. Fragment & vertex program
    Par charly dans le forum OpenGL
    Réponses: 5
    Dernier message: 19/03/2004, 20h47
  3. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 03h38
  4. Vertex et Pixel Shader
    Par Riko dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/06/2003, 17h45
  5. vertex vertices
    Par gRRosminet dans le forum OpenGL
    Réponses: 2
    Dernier message: 05/11/2002, 04h04

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