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 :

utilisation GLSL -- HeLP!


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut utilisation GLSL -- HeLP!
    Hello à tous!

    Voici mon problème, peut-être une âme charitable saura-t-elle m'aider.
    Je test un moteur de rendu C++/GLUT/GLEW/OpenGL pour un petit jeu que je veux commencer. Pour ça je veux rajouter les shaders GLSL.

    J'ai créer une classe de shader qui charge, active, désactive, et se charge de la communication openGl<-->shader. Tout ça avec un errorlog pour suivre ce qui se passe.

    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
    class CShader
    {
    public:
    // Sauvegarde le l’objet OpenGL identifiant le programme
        GLhandleARB ShaderProg;
        bool isOK;
     
        // Chargement des fichiers textes contenant le code GLSL
        char* _Load(const char* szFilename);
     
        CShader();
        CShader (char* vscript, char* fscript);
        ~CShader();
     
        // Activation du shader
        void Enable();
        // Deactivation du shader
        void Disable();
        // Récupération de l’identifiant d’une variable uniform
        unsigned int Uniform(const char* szNameVar) const;
        // Récupération de l’identifiant d’une variable d’attribut
        unsigned int Attrib(const char* szNameVar) const;
    };
    Mon problème:
    J'ai les scriptes pour un vertex et fragment shaders basiquissimes qui sont: ouverts, compilés, attaché au prog et le prog lié sans problème. Pas de message d'erreur dans ce processus.

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    CShader::CShader (char* vscript, char* fscript)
    {
        ShaderProg = 0;
        isOK = false;
     
        GLhandleARB v, f;
     
        v = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
    	f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
    	ShaderProg = glCreateProgramObjectARB();
     
        errorLog="GLSL:";
     
        FILE *fp;
        GLcharARB *shader_string;
        GLint str_length, maxLength;
        GLcharARB *pInfoLog;
        GLint isCompiled = GL_FALSE, isLinked = GL_FALSE;
     
        // open the file of shader source code
        if((fp=fopen(vscript, "r")) == NULL) {
         errorLog += "failed to load vertex script.";
         } else {
         errorLog  += "vertex script open. ";
     
        // allocate memory for program string and load it.
        shader_string = (GLcharARB*) malloc(sizeof(GLcharARB) * 65536);
        str_length = (GLint) fread(shader_string, 1, 65536, fp);
        fclose(fp);
     
        glShaderSourceARB(v, 1, (const GLcharARB**)&shader_string, &str_length);
        free(shader_string);
     
        glCompileShaderARB(v);
     
        // get compile state information
        glGetObjectParameterivARB(v, GL_OBJECT_COMPILE_STATUS_ARB, &isCompiled);
     
        if (!isCompiled) {
            errorLog += "error compiling vertex script.";
            glGetObjectParameterivARB(v, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
            pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
            glGetInfoLogARB(v, maxLength, &str_length, pInfoLog);
            errorLog += pInfoLog;
            free(pInfoLog);
        } else {
           errorLog += "compiled. ";
           glAttachObjectARB(ShaderProg, v);
           errorLog += "attached. ";
          // glDeleteObjectARB(v);
     
           // à ce point le vertex shader est ok, on continue avec le fragment shader
     
           if((fp=fopen(fscript, "r")) == NULL) {
            errorLog += "failed to load fragment script.";
            } else {
            errorLog  += "fragment script open. ";
            // allocate memory for program string and load it.
            shader_string = (GLcharARB*) malloc(sizeof(GLcharARB) * 65536);
            str_length = (GLint) fread(shader_string, 1, 65536, fp);
            fclose(fp);
     
            glShaderSourceARB(f, 1, (const GLcharARB**)&shader_string, &str_length);
            free(shader_string);
     
            glCompileShaderARB(f);
     
            // get compile state information
            isCompiled = GL_FALSE;
            glGetObjectParameterivARB(f, GL_OBJECT_COMPILE_STATUS_ARB, &isCompiled);
     
            if (!isCompiled) {
            errorLog += "error compiling fragment script.";
            glGetObjectParameterivARB(f, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
            pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
            glGetInfoLogARB(f, maxLength, &str_length, pInfoLog);
            errorLog += pInfoLog;
            free(pInfoLog);
            } else {
            errorLog += "compiled. ";
            glAttachObjectARB(ShaderProg, f);
            errorLog += "attached. ";
           // glDeleteObjectARB(f);
            isOK = true;
            }
     
            }
        }
       }
     
       if(isOK){
    	glLinkProgramARB(ShaderProg);
    	glGetObjectParameterivARB(ShaderProg, GL_OBJECT_LINK_STATUS_ARB, &isLinked);
     
        if(!isLinked)
        {
        errorLog += "error linking program. ";
        glGetObjectParameterivARB(ShaderProg, GL_OBJECT_INFO_LOG_LENGTH_ARB, &maxLength);
        pInfoLog = (GLcharARB *) malloc(maxLength * sizeof(GLcharARB));
        glGetInfoLogARB(ShaderProg, maxLength, &str_length, pInfoLog);
        errorLog += pInfoLog;
        free(pInfoLog);
        isOK = false;
        } else
         errorLog += "Program linked.";
     
       }
    };
    L'horreur commence quand je veux m'en servir. Dans ma fonction de display, j'ai beau utiliser glUseProgramObjectARB(monShaderProgram) ... rien ne se passe et le rendu de mes objets n'est pas modifié.

    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
    53
    54
    55
    void Scene::renderScene(void) {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glPushMatrix();
     
    	glRotatef(angle,0.0,1.0,0.0);
     
     
    //	glColor3f(baseColor.r,baseColor.g,baseColor.b);
     
        // fog
        //glEnable(GL_FOG);
     
        // rendering des meshs
     
        glEnable(GL_LIGHTING);
        glColor3f(1.0,1.0,1.0);
     
        glDisable( GL_TEXTURE_2D );
     
        shader[0].Enable(); // <--- active le shaderprog
     
        floor.render(zoom*100); //fait un rendu en triangle de l'objet
     
        mesh.render(zoom*1000);//fait un rendu en triangle de l'objet
     
    	glPopMatrix();
    	angle++;
     
        // texte
    	glDisable( GL_TEXTURE_2D );
    	glDisable(GL_LIGHTING);
        glDisable(GL_DEPTH_TEST);
     
    	setOrthographicProjection();
    	glPushMatrix();
    	glLoadIdentity();
     
     
        glColor3f(1.0,1.0,1.0);
        char s[260] ;
     
        s[0] = '\0';
        strcat(s, errorLog.c_str());
        renderBitmapString(5,110,0,GLUT_BITMAP_HELVETICA_10,s);
     
    	renderBitmap(0,0,h-100,100,70, 1);
     
    	glPopMatrix();
    	resetPerspectiveProjection() ;
        glEnable( GL_TEXTURE_2D );
        glEnable(GL_LIGHTING);
        glEnable(GL_DEPTH_TEST);
     
    	glutSwapBuffers();
    };
    Que faire... ?? Heeeeeelp, donc!
    Merci d'avance pour le coup de main.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Une bonne chose à faire pour commencer serait de vérifier les erreurs (glGetError) après chaque appel OpenGL.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut Suite des tests... pas mieux
    Merci Laurent de ta réponse rapide !

    J'ai poursuivit les tests selon ton conseil, un appel à glGetError après chaque appel OpenGL ... et pas une seule erreur dans tout le programme.

    Quelqu'un aurait-il une idée pour faire marcher ce bazaar?

    Merci d'avance!

    PS: je rame là...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut screenshot
    Je joint même un screenshot de ce que ça donne sans ... et malheureusement avec, l'appel au shaders...

    Pour l'inspiration...

    Images attachées Images attachées  

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Et le shader il ressemble à quoi ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Par défaut les shaders
    J'ai testé avec le plus basique possible...

    Le vertex shader simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void main()
    {    
       vec4 p;
     
        gl_Position = gl_ModelViewProjectionMatrix * p;
    }
    Le fragment shader simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void main()
    {
        gl_FragColor = vec4(0.0,0.8,0.0,1.0);
     
    }

  7. #7
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Rhaaa j'ai écrit mon premier shader sans l'aide du livre .
    Je suis allé voir dans mon bouquin de math les formules pour calculer les composantes specular, diffuse et ambient, et j'ai codé tout ça, et ça marche bien !

    Quel plaisir de pouvoir faire de l'éclairage basique, mais sans avoir glEnable (GL_LIGHTING). Tout à la main !

    Bon c'est pas un éclairage terrible terrible, juste comme celui implémenté de base dans OpenGL, mais c'est vraiment puissant ces shaders !

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

Discussions similaires

  1. help installation et utilisation tomcat eclipse
    Par irnbru dans le forum Eclipse
    Réponses: 1
    Dernier message: 15/10/2007, 04h40
  2. [GLSL]utiliser des textures dans un vertex shader
    Par delfare dans le forum OpenGL
    Réponses: 14
    Dernier message: 04/10/2007, 10h31
  3. Utilisation de "Microsoft help Workshop"
    Par defluc dans le forum Outils
    Réponses: 0
    Dernier message: 29/09/2007, 21h12
  4. [ORBEON] XForms, utilisation, help me
    Par the_mat dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 13/03/2007, 09h36
  5. utilisation du help file dans les composants de la VCL
    Par SOPRA-Eherve dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/09/2006, 22h47

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