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

C++ Discussion :

[Erreur Opengl] erreur link Shader vide


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut [Erreur Opengl] erreur link Shader vide
    Bonjour,

    Je suis actuellement entrain de faire mon moteur 3D suite au tuto "moteur 3D c++" et je suis entrain de faire un loader de Model 3D en utilisant tous les type de textures.

    J'ai un problème suite au chargement de shader qui m'empêche d'avancer dans mon loader pour les textures de normal.

    J'ai réussie à compiler le shader sans problème aucune erreur est retourner mais des que j'essaye de lier un program créer (glLinkProgram) une erreur arrive mais le problème c'est qu'aucune infos n'est renvoyer.

    J'ai bo regarder sur internet je n'arrive pas à trouver le moyen de trouver cette erreur.

    voici les infos de ma carte graphique (je précise que j'essaye d'utiliser opengl 3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* Vendor    = (char*)glGetString(GL_VENDOR);   // "NVIDIA Corporation"
    char* Renderer_ = (char*)glGetString(GL_RENDERER); // "GeForce 9300M GS/PCIe/SSE2"
    char* version   = (char*)glGetString(GL_VERSION);  // 3.0.0
    voici la fonction pour lier le program :
    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
     
         bool C_GLSLProgram::link(){
    		if (isLinked()) return true;
    		if (m_handle <= 0)
    			//return false;
     
    		glLinkProgram(m_handle);
     
    		if (CheckedErrorGLSLProgram(m_handle, GL_LINK_STATUS, "Link Status")){
    			deleteAllShader();
    			throw GLSLException("CheckedErrorGLSLProgram", "link");
    			return false;
    		}
    		else {
    			m_params.clear();
    			m_linked = true;
    		}
    		return false;
    	}
    voici le code pour m'afficher l'erreur :
    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
     
                                // rentre dans le if donc le program à bien été créer 
                                if (glIsProgram(p_progHandle)){				
    					GLint programState = 0;
     
    					CheckedGLCall(glGetProgramiv(p_progHandle, GL_LINK_STATUS, &programState));
    					if (programState != GL_TRUE){
    						int length = 0;
    						std::string logString;
     
    						CheckedGLCall(glGetProgramiv(p_progHandle, GL_INFO_LOG_LENGTH, &length));
     
    						if (length > 0) {
    							char * c_log = new char[length];
    							int written = 0;
    							CheckedGLCall(glGetProgramInfoLog(p_progHandle, length, &written, c_log));
    							logString = c_log;
    							delete[] c_log;
    						}
    						std::ostringstream outLog;
    						outLog	<< "Program Shader OpenGL Error in '" << File
    								<< "' at line: '" << Line
    								<< "\n\n"
    								<< "Error description : " << p_message << "\n : Error n°(" << programState << ")"
    								<< logString;
    						C_ILogger::setLogger(new C_LoggerMsgBox);
    						C_ILogger::Log() << outLog.str();
     
    						return true;
    					}
    				}
    				else{
    					std::ostringstream outLog;
    					outLog << "Program Shader OpenGL Error in '" << File
    						<< "' at line: '" << Line
    						<< "\n\n"
    						<< "Error description : \n" << p_message << "\n"
    						<< p_progHandle << " Program has not been compiled.";
    					C_ILogger::setLogger(new C_LoggerMsgBox);
    					C_ILogger::Log() << outLog.str();
    				}
    voici le Shader utiliser pour tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #version 130
     
    in vec3 aVertex;
     
    void main()
    {
        gl_Position = vec4(aVertex, 0.1);
    }
    Est-ce que quelqu'un aurais une idée pour m’orienter vers mes recherches pour afficher le problème? je vous remercie d'avance

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Salut!

    Tu es en OpenGL 3, donc tu devrais fournir un fragment shader.

    Quelle est l'erreur que tu as? plantage? link du shader échoué avec une erreur textuelle? Code d'erreur OpenGL?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Salut,

    Désoler encor d'avoir besoin de ton aide

    Tu es en OpenGL 3, donc tu devrais fournir un fragment shader.
    j'ai pas utiliser de Fragment Shader je pensais qu'il n'était pas obligatoire (peut être l'habitude de openGL 2) j'ai déja utiliser sur plusieur projet que le Vertex Shader.

    donc je doit obligatoirement utiliser un fragment Shader?

    Quelle est l'erreur que tu as? plantage? link du shader échoué avec une erreur textuelle? Code d'erreur OpenGL?
    justement j'ai rien à part un plantage complet si j'enlève l’exception que j'ai mi. Il m'indique que j'ai une erreur au niveau de glLinkProgram(idProgram) mais ne m'envoie rien comme infos lorsque j'utilise glGetProgramInfoLog

    voici l'ordre d'éxécution :

    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
     
    // création du shader
    GLuint shaderHandle = glCreateShader(GetTypeShaderRenderer(p_type));
     
    // envoie du contenue du shader
    const char* c_code = shaderString.c_str();
    CheckedGLCall(glShaderSource(shaderHandle, 1, &c_code, NULL));
     
    // Compile le shader
    CheckedGLCall(glCompileShader(shaderHandle));
     
    // regarde si il y a une erreur
    if (CheckedErrorGLSLShader(shaderHandle, "shader compliation failed\n")){
    	deleteAllShader();
    	throw GLSLException("glCompileShader", "compileShader");
    }
    else {
    	// créer un program  
    	createHandle();
     
    	// attache le shader au program
    	CheckedGLCall(glAttachShader(m_handle, shaderHandle));
     
    	glLinkProgram(m_handle);
     
    	if (CheckedErrorGLSLProgram(m_handle, GL_LINK_STATUS, "Link Status")){
    		deleteAllShader(); // delete le program et les shader attachés
    		throw GLSLException("CheckedErrorGLSLProgram", "link");
    		return false;
    	}
    }
    CheckedGLCall est un macro que j'ai utiliser pour checker les erreur opengl (il lance la fonction et regarde si il y a une erreur openGL) :
    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
     
    #define CheckedGLCall(x) { x; C_OGLException::PrintOpenGLError(#x, __FILE__, __LINE__); }
     
    static void PrintOpenGLError(const char* const Function, const char* const File, unsigned int const Line){
        GLenum Error = glGetError();
        if (Error != GL_NO_ERROR){
            std::string ErrorGLStr = C_OGLException::GetOpenGLError();
    	 if (!ErrorGLStr.empty()){						  
    	      C_ILogger::setLogger(new C_LoggerMsgBox);
    	      C_ILogger::Log() << "OpenGL Error in '" << File
    	                             << "' at line: '" << Line
    			             << "' calling function:" << Function
    				     << "Error description : \n" << ErrorGLStr;
    	}
         }
    }
    la ou sa plante c'est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            glLinkProgram(m_handle);
     
    	if (CheckedErrorGLSLProgram(m_handle, GL_LINK_STATUS, "Link Status")){
    		deleteAllShader(); // delete le program et les shader attachés
    		throw GLSLException("CheckedErrorGLSLProgram", "link");
    		return false;
    	}
    CheckedErrorGLSLProgram correspond à une autre macro :
    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
     
    #define CheckedErrorGLSLProgram(x, e, m) \
    	(C_OGLShaderException::PrintProgramShaderError(x, e, __FILE__, __LINE__, m))
     
    // correspond à 
    static bool PrintProgramShaderError(GLuint p_progHandle, GLenum p_name, const char* const File, unsigned int const Line, const std::string& p_message = ""){
    				if (glIsProgram(p_progHandle)){				
    					GLint programState = 0;
     
    					CheckedGLCall(glGetProgramiv(p_progHandle, GL_LINK_STATUS, &programState));
    					if (programState != GL_TRUE){
    						int length = 0;
    						std::string logString;
     
    						CheckedGLCall(glGetProgramiv(p_progHandle, GL_INFO_LOG_LENGTH, &length));
     
    						if (length > 0) {
    							char * c_log = new char[length];
    							int written = 0;
    							CheckedGLCall(glGetProgramInfoLog(p_progHandle, length, &written, c_log));
    							logString = c_log;  // <- ici le log retourne rien
    							delete[] c_log;
    						}
    						std::ostringstream outLog;
    						outLog	<< "Program Shader OpenGL Error in '" << File
    								<< "' at line: '" << Line
    								<< "\n\n"
    								<< "Error description : " << p_message << "\n : Error n°(" << programState << ")"
    								<< logString;
    						C_ILogger::setLogger(new C_LoggerMsgBox);
    						C_ILogger::Log() << outLog.str();
     
    						return true;
    					}
    				}
    				else{
    					std::ostringstream outLog;
    					outLog << "Program Shader OpenGL Error in '" << File
    						<< "' at line: '" << Line
    						<< "\n\n"
    						<< "Error description : \n" << p_message << "\n"
    						<< p_progHandle << " Program has not been compiled.";
    					C_ILogger::setLogger(new C_LoggerMsgBox);
    					C_ILogger::Log() << outLog.str();
    				}
     
    				return false;
    			}
    le problème c'est que même en testant les erreur openGL et de Shader ainsi que Program Cela me retourne rien. Le shader compile bien, est bien attacher au program mais une fois que je veux faire un link la problème mais l'infos est vide

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    						outLog	<< "Program Shader OpenGL Error in '" << File
    								<< "' at line: '" << Line
    								<< "\n\n"
    								<< "Error description : " << p_message << "\n : Error n°(" << programState << ")"
    								<< logString;
    Tu as cet affichage là?
    Et tu es passé avec un debugger, pour voir ce que vaut length?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Tu as cet affichage là?
    en effet j'ai mon messageBox qui s'affiche :


    Et tu es passé avec un debugger, pour voir ce que vaut length?
    En effet j'ai parcourue le code au moin 100 fois ligne par ligne
    length = 1

    C'est sa qui me parait bizarre car si je provoque une erreur dans le Shader et que j'utilise la même fonction de vérife cela marche en me retournant bien l'infos de l'erreur.
    voici la fonction qui vérifie l'erreur au niveau de la compilation du 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
                         static bool PrintShaderError(GLuint p_handle, const char* const File, unsigned int const Line, const std::string& p_message = ""){
    					int result;
    					glGetShaderiv(p_handle, GL_COMPILE_STATUS, &result);
    					if (GL_FALSE == result) {
    						int length = 0;
    						std::string logString;
    						glGetShaderiv(p_handle, GL_INFO_LOG_LENGTH, &length);
    						if (length > 0) {
    							char * c_log = new char[length];
    							int written = 0;
    							glGetShaderInfoLog(p_handle, length, &written, c_log);
    							logString = c_log;
    							delete[] c_log;
    						}
    						std::ostringstream outLog;
    						outLog << "Shader OpenGL Error in '" << File
    								<< "' at line: '" << Line
    								<< "\n\n"
    								<< "Error description : " << p_message << "\n"
    								<< logString;
    						C_ILogger::setLogger(new C_LoggerMsgBox);
    						C_ILogger::Log() << outLog.str();
    						return true;
    					}
    					else{
    						return false;
    					}
    			}
    Le numéro dans le message d'erreur correspond au retour de glGetProgramiv au cas ou j'aurais une erreur avec d'autre vérif mais GL_LINK_STATUS retourne qu'un booléan.
    J'ai regarder sur internet pour voir si c'était ma version de Shader qui pouvais poser problème ou non donc j'ai essayer plusieur version mais sans résultat.

    La seul chose que j'ai pas essayer c'est d'ajouter un FragmentShader car je sais que openGL 3 nous force à définir nous même pas mal de chose donc peut être que c'est sa mais je sais pas du tous.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 58
    Par défaut
    Ba je viens d'essayer en rajoutant un Fragment Shader mais malheureusement pareil même résultat

    voici le Fragment Shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #version 130
     
    // Sortie
    out vec3 Color;
     
    void main(){	
    	Color = vec3(1, 1, 1);
    }
    et le code qui compile les deux 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
    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
     
                    C_File shaderFile(p_fileName);
     
    		if (!shaderFile.exists()){
    			string message = string("Shader: ") + p_fileName + " not found.";
    			//throw GLSLProgramException(message);
    		}
     
    		ifstream inFile(p_fileName, ios::in);
    		if (!inFile) {
    			string message = string("Unable to open: ") + p_fileName;
    			//throw GLSLProgramException(message);
    		}
    		C_File shaderFile(p_fileName);
    		// Get file contents
    		string shaderString;
    		//Get shader source 
    		shaderString.assign((istreambuf_iterator< char >(inFile)), istreambuf_iterator< char >());
    		inFile.close();
     
    		GLuint shaderHandle = glCreateShader(GetTypeShaderRenderer(p_type));
     
    		const char* c_code = shaderString.c_str();
    		CheckedGLCall(glShaderSource(shaderHandle, 1, &c_code, NULL));
    		// Compile the shader
    		CheckedGLCall(glCompileShader(shaderHandle));
    		// Check for errors
    		if (CheckedErrorGLSLShader(shaderHandle, "shader compliation failed\n")){
    			deleteAllShader();
    			throw GLSLException("glCompileShader", "compileShader");
    		}
    		else {			
    			///////////////////////
    			// Ajout en dur pour test
    			//////////////////////
    			C_File shaderFileFrag("testShader.frag");
    			// Get file contents
    			string shaderString;
    			//Get shader source 
    			shaderString.assign((istreambuf_iterator< char >(inFile)), istreambuf_iterator< char >());
    			inFile.close();
     
    			GLuint shaderFragmentHandle = glCreateShader(GetTypeShaderRenderer(TShaderType::SHADER_FRAGMENT));
     
    			const char* c_codeFrag = shaderString.c_str();
    			CheckedGLCall(glShaderSource(shaderFragmentHandle, 1, &c_codeFrag, NULL));
    			// Compile the shader
    			CheckedGLCall(glCompileShader(shaderFragmentHandle));
    			// Check for errors
    			if (CheckedErrorGLSLShader(shaderFragmentHandle, "shader Framgment compliation failed\n")){
    				deleteAllShader();
    				throw GLSLException("glCompileShader", "compileShader");
    			}
     
     
     
     
     
    			createHandle();
    			// Compile succeeded, attach shader
    			CheckedGLCall(glAttachShader(m_handle, shaderHandle));
    			CheckedGLCall(glAttachShader(m_handle, shaderFragmentHandle));
    			link();
    		}
    aucune erreur dans la compilation et l'attach des deux Shader

    La je sais plus ou regarder honnetement je comprend pas.

    Est-ce possible qu'il plante au link car je n'est pas fait un BindAttribute avant de créer les Shader?

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

Discussions similaires

  1. [gsoap] erreur par rapport au noeud vide
    Par grelon dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 24/04/2007, 17h07
  2. [VBA][03] Erreur dans une fonction qui vide des tables
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/04/2007, 14h13
  3. message d'erreur quand un champs est vide
    Par VIRGINIE87 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2007, 12h13
  4. Erreur Opengl
    Par harris_macken dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/11/2006, 09h28
  5. erreurs opengl avec devcpp
    Par Vermin dans le forum OpenGL
    Réponses: 2
    Dernier message: 13/04/2004, 14h50

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