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 :

Compilation shader: syntax error


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut Compilation shader: syntax error
    Bonjour,

    Quand je compile mon vertex shader, j'obtiens cette erreur:
    0(1) : error C0000: syntax error, unexpected $undefined at token "@"
    0(1) : error C0501: type name expected at token "@"
    0(2) : warning C7530: OpenGL requires main to return void
    0(2) : error C1110: function "main" has no return statement
    Mon shader:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void main()
    {
    	//glOrtho(-1.0, 1.0, -1.0, 1.0, 0.0, 1.0):		
    	mat4 mModelView = mat4(
    		1.0, 0.0, 0.0, 0.0, 
    		0.0, 1.0, 0.0, 0.0,
    		0.0, 0.0, -2.0, 0.0,
    		0.0, 0.0, -1.0, 1.0);
     
    	gl_TexCoord[0] = gl_MultiTexCoord0;
     
    	gl_Position = mModelView * gl_Vertex;
    }
    Je ne comprends vraiment pas ce qui ne va pas. Quelques pistes:
    1) Je lis mon vertex shader à partir d'un fichier texte et j'ai vérifié byte par byte ce que je lis: ça me semble correcte (pas de caractères bizarre, etc.) !
    2) Plus étrange: j'ai en fait 2 shaders (2 vertex shader et 2 fragment shader). La compilation du premier shader ne retourne aucune erreur. Par contre la compilation du second shader me retourne une erreur (celle que j'ai mis au début de mon post).
    Si j'inverse l'ordre de compilation: je compile d'abord mon second shader et ensuite le premier shader: c'est le premier shader qui me retourne une erreur (similaire à celle de ce post) !!!

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Comment tu compile ton shader ?
    Tu peux mettre le code qui fait cela ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Voici le code qui compile le shader:
    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
    unsigned int shaderID = glCreateProgramObjectARB();
     
    //vertex shader
    const char *vertexShaderSource = readEntireFile(vertexShaderFilename).c_str();
    unsigned int vertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
    glShaderSourceARB(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShaderARB(vertexShader);
    printLog(vertexShader, vertexShaderFilename);
    glAttachObjectARB(shaderID, vertexShader);
     
    //fragment shader
    const char *fragmentShaderSource = readEntireFile(fragmentShaderFilename).c_str();
    unsigned int fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
    glShaderSourceARB(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShaderARB(fragmentShader);
    printLog(fragmentShader, fragmentShaderFilename);
    glAttachObjectARB(shaderID, fragmentShader);
     
    glLinkProgramARB(shaderID);
    printLog(shaderID, vertexShaderFilename + "(link)");
    Lecture du fichier:
    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
    string ShaderManager::readEntireFile(const string &filename)
    {
    	string fileContent;
    	fileContent.reserve(10000);
     
    	ifstream file;
    	file.open(filename.c_str(), ios::in|ios::binary);
    	if(file.fail())
    	{
    		throw FileException(filename, "Cannot open this file.");
    	}
     
    	char c;
    	while (file.get(c))
    	{
    		fileContent.append(1, c);
    	}
     
    	file.close();
     
    	return fileContent;
    }

  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
    Ton objet string que tu retournes avec ta fonction de lecture de fichier n'est pas garde quelque part... En gros au moment ou tu appelles ta fonction ton objet string est detruit. Tu essaies ensuite d'acceder a une zone memoire desallouee qui peut etre ensuite etre reutilisee par d'autres objets qui vaut mettre des @m etc. Pour fixer cela fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const string fragmentShaderSource = readEntireFile(fragmentShaderFilename);
    unsigned int fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
    glShaderSourceARB(fragmentShader, 1, &fragmentShaderSource._c_str(), NULL);
    Edit: petite coquille dans le code ci-dessus explique dans les posts qui suivent.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Par défaut
    Bien vu Problème résolu: merci.

    Par contre, j'ai une autre petite question:
    Ce code source compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const string fragmentShaderSource = readEntireFile(fragmentShaderFilename);
    const char *fragmentShaderSourceChar = fragmentShaderSource.c_str();
    glShaderSourceARB(fragmentShader, 1, &fragmentShaderSourceChar, NULL);
    Pas celui-ci (avec ou sans les parenthèses):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const string fragmentShaderSource = readEntireFile(fragmentShaderFilename);
    glShaderSourceARB(fragmentShader, 1, &(fragmentShaderSource.c_str()), NULL);
    Erreur: "lvalue required as unary ‘&’ operand."
    Il ne serait pas un peu con mon compilateur (ou alors c'est moi le con ) ? (g++)

  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
    Non c'est le meme principe, la fonction c_str() retourne un pointeur de char et toi tu donnes l'adresse de ce pointeur en memoire qui est lui-meme... temporaire... Il est detruit des que tu rentres dans la fonction invalidant l'adresse le referencant que tu viens juste de passer a la fonction .

    Il faut donc que tu crees ton pointeur avant d'appeler la fonction pour etre sur qu'il soit toujours valide quand tu rentres a l'interieur de la fonction.

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

Discussions similaires

  1. Syntax error à la compilation d'un programme
    Par Nicoleta Ionel dans le forum Linux
    Réponses: 2
    Dernier message: 02/05/2011, 23h42
  2. Syntax error
    Par vincedjs dans le forum Langage
    Réponses: 3
    Dernier message: 01/02/2006, 16h58
  3. Compilation shader
    Par pdufranc dans le forum OpenGL
    Réponses: 4
    Dernier message: 18/11/2005, 19h58
  4. Syntax Error / Questions
    Par kedare dans le forum Général Python
    Réponses: 15
    Dernier message: 12/09/2005, 14h05
  5. "vector" provoque "syntax error", malgré
    Par seenkay dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 24/08/2003, 03h21

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