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 :

[GLSL] Problème de compilation VS/FS


Sujet :

OpenGL

  1. #1
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut [GLSL] Problème de compilation VS/FS
    Bonjour à tous,

    Je ne vois pas pourquoi mon code ne fonctionne pas, alors je me suis dis que de l'extérieur vous pourriez mieux voir, je vous soumets donc ma petite structure:

    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
    struct LDEshader
    {
        LDEuint fragment_shader,
                vertex_shader,
                program;
        LDEint  compiled,
                linked;
     
        string  line,
                page;
        istringstream iss;
     
        char shader_link_error[4096];
     
        void init()
        {
            program = glCreateProgram();
        }
     
        void fragment(string name)
        {
            // read file
            ifstream file( LDEstc(name) );
            if ( file.is_open() )
            {
                while ( getline(file,line) ) page += line;
                file.close();
                line.erase();
     
                // create stuff
                fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
     
                const GLchar *page_char = LDEstc(page); page.erase();
     
                glShaderSource( fragment_shader,1,&page_char,NULL );
     
                glCompileShader(fragment_shader);
     
                glGetShaderiv(fragment_shader,GL_COMPILE_STATUS,&compiled);
                if( !compiled )
                {
                    cout<<"Couldn't compile "<<name<<"\n{\n";
                    glGetInfoLogARB( fragment_shader, sizeof(shader_link_error), NULL, shader_link_error );
                    cout<<shader_link_error<<"}\n";
                }
     
                glAttachShader(program,fragment_shader);
            }
        }
     
        void vertex(string name)
        {
            // read file
            ifstream file( LDEstc(name) );
            if ( file.is_open() )
            {
                while ( getline(file,line) ) page += line;
                file.close();
                line.erase();
     
                // create stuff
                vertex_shader = glCreateShader(GL_VERTEX_SHADER);
     
                const GLchar *page_char = LDEstc(page); page.erase();
     
                glShaderSource( vertex_shader,1,&page_char,NULL );
     
                glCompileShader(vertex_shader);
     
                glGetShaderiv(vertex_shader,GL_COMPILE_STATUS,&compiled);
                if ( !compiled )
                {
                    cout<<"Couldn't compile "<<name<<"\n{\n";
                    glGetInfoLogARB( vertex_shader, sizeof(shader_link_error), NULL, shader_link_error );
                    cout<<shader_link_error<<"}\n";
                }
     
                glAttachShader(program,vertex_shader);
            }
        }
     
        void link()
        {
            glLinkProgram(program);
            glGetObjectParameterivARB( program, GL_OBJECT_LINK_STATUS_ARB, &linked );
        }
     
        void use()
        {
            glUseProgram(program);
        }
    };
    Je fais l'utilisation ainsi:
    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
     
    // ...
     
    main() // ...
    {
        //...
        LDEshader shader;
        shader.init();
        shader.vertex("vertex_shader.vert");
        shader.fragment("fragment_shader.frag");
        shader.link();
     
        // ...
        loop() //...
        {
    	//...
                shader.use();
     
      	// some opengl stuff ...
        }
    }
    Lors de l'exécution du programme, j'obtiens ceci de GLSL:
    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
    Couldn't compile vertex_shader.vert
     
    {
     
    (0) : error C0000: syntax error, unexpected $end at token "<null atom>"
     
    (0) : error C0501: type name expected at token "<null atom>"
     
    }
     
    Couldn't compile fragment_shader.frag
     
    {
     
    (0) : error C0000: syntax error, unexpected $end at token "<null atom>"
     
    (0) : error C0501: type name expected at token "<null atom>"
     
    }
    Voyez vous l'erreur?
    Merci d'avance

    edit: Mes petits Vertex/Fragment Shader sont les suivants:
    http://gdorin.hopto.org/divers/LDE/vertex_shader.vert
    http://gdorin.hopto.org/divers/LDE/fragment_shader.frag

  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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce genre d'erreur arrive lorsque le fichier n'est pas trouvé. Assure-toi que ton répertoire de travail est bien celui qui contient les shaders. Tu peux aussi tester l'existence du fichier avant d'essayer de le compiler, ça te donnera une erreur plus explicite.

  3. #3
    Membre éclairé
    Avatar de Happy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2005
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Autre

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2005
    Messages : 665
    Points : 875
    Points
    875
    Par défaut
    Apparemment les fichiers sont trouvés et lus, d'ailleurs "const GLchar *page_char" contient le contenu de chacun, mais après je ne vois pas pourquoi ça ne compile pas

    edit: Voici le code si vous voulez compiler chez vous:
    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
    // string to char*
    const char *LDEstc( string st )
    {
        const char *ch = st.c_str();
        return ch;
    }
     
    //
    struct LDEshader
    {
        GLuint fragment_shader,
                vertex_shader,
                program;
        GLint  compiled,
                linked;
     
        string  line,
                page;
        istringstream iss;
     
        char shader_link_error[4096];
     
        void init()
        {
            program = glCreateProgram();
        }
     
        void fragment(string name)
        {
            // read file
            ifstream file( LDEstc(name) );
            if ( file.is_open() )
            {
                while ( getline(file,line) ) page += line;
                file.close();
                line.erase();
     
                // create stuff
                fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
     
                const GLchar *page_char = LDEstc(page); page.erase();
     
                glShaderSource( fragment_shader,1,&page_char,NULL );
     
                glCompileShader(fragment_shader);
     
                glGetShaderiv(fragment_shader,GL_COMPILE_STATUS,&compiled);
                if( !compiled )
                {
                    cout<<"Couldn't compile "<<name<<"\n{\n";
                    glGetInfoLogARB( fragment_shader, sizeof(shader_link_error), NULL, shader_link_error );
                    cout<<shader_link_error<<"}\n";
                }
     
                glAttachShader(program,fragment_shader);
            }
        }
     
        void vertex(string name)
        {
            // read file
            ifstream file( LDEstc(name) );
            if ( file.is_open() )
            {
                while ( getline(file,line) ) page += line;
                file.close();
                line.erase();
     
                // create stuff
                vertex_shader = glCreateShader(GL_VERTEX_SHADER);
     
                const GLchar *page_char = LDEstc(page); page.erase();
     
                glShaderSource( vertex_shader,1,&page_char,NULL );
     
                glCompileShader(vertex_shader);
     
                glGetShaderiv(vertex_shader,GL_COMPILE_STATUS,&compiled);
                if ( !compiled )
                {
                    cout<<"Couldn't compile "<<name<<"\n{\n";
                    glGetInfoLogARB( vertex_shader, sizeof(shader_link_error), NULL, shader_link_error );
                    cout<<shader_link_error<<"}\n";
                }
     
                glAttachShader(program,vertex_shader);
            }
        }
     
        void link()
        {
            glLinkProgram(program);
            glGetObjectParameterivARB( program, GL_OBJECT_LINK_STATUS_ARB, &linked );
        }
     
        void use()
        {
            glUseProgram(program);
        }
    };
    edit2: Bon, même si moi c'est C++, problème résolu avec ce loader C de fichier texte:
    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
    char *textFileRead(char *fn)
    {
     
     
    	FILE *fp;
    	char *content = NULL;
     
    	int count=0;
     
    	if (fn != NULL)
    	{
    		fp = fopen(fn,"rt");
     
    		if (fp != NULL)
    		{
     
    			fseek(fp, 0, SEEK_END);
    			count = ftell(fp);
    			rewind(fp);
     
    			if (count > 0)
    			{
    				content = new char[count+1];
    				count = fread(content,sizeof(char),count,fp);
    				content[count] = '\0';
    			}
    			fclose(fp);
    		}
    	}
    	return content;
    }

  4. #4
    Futur Membre du Club
    Profil pro
    Ingénieur développement logiciel
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 9
    Points
    9
    Par défaut
    Même si ton problème est résolu, j'ai peut-être une solution à apporter à ta classe en C++, cela pourrait utile à d'autres.

    Je pense que tu n'inclues pas de sauts de ligne dans ton code source de shader quand tu le lis. Du coup, dès qu'un commentaire est présent, le code source est foireux inévitablement (manque généralement la fermeture du main "}" ).

    La méthode getLine(...) prend la ligne dans le flux mais sans ajouter \n à la fin du string rempli. J'avais eu le même problème.

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

Discussions similaires

  1. problème de compilation sous visual C++
    Par fabmili dans le forum MFC
    Réponses: 4
    Dernier message: 08/02/2004, 19h52
  2. problème de compil devc++ socket
    Par stefdem dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/12/2003, 11h33
  3. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  4. Problème de compilation de la DLL du XMLRad
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 2
    Dernier message: 16/04/2003, 16h46
  5. Réponses: 1
    Dernier message: 27/05/2002, 01h44

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