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++

  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?

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut
    OpenGL a beaucoup changé avec la version 3 donc tu devrais peut-être tester sur des petits programmes avant de te lancer dans un moteur (cf, par exemple, http://www.opengl-tutorial.org).

    Dans tes shaders, la ligne #version 130 me semble bizarre pour faire de l'OpenGL 3. Tu devrais essayer les shaders suivants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #version 330 core
    // vertex shader
    layout(location = 0) in vec3 vertexPosition_modelspace;
    void main() {
        gl_Position = vec4(vertexPosition_modelspace, 1.0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #version 330 core
    // fragment shader
    layout(location = 0) out vec3 color;
    void main() {
        color = vec3(1,0,0);
    }

  8. #8
    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

    Merci pour ton aide.

    Alors j'ai essayer ton vertex Shader et Fragment Shader sans succès toujour pareil

    J'ai donc suivie ton conseil et le faire sur un autre petit projet et en effet j'en avais déja un (un examen de cour) j'ai donc essayer sur ce projet mais pareil sans succès

    Se code la marche sur le petit projet :
    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
     
    #version 120
     
    uniform bool key_R = false;
    uniform bool key_G = false;
    uniform bool key_B = false;
     
    uniform bool key_SPACE = false;
     
    vec4 reverseColor(in vec4 p_color){
    	/* Inverse la couleur rouge */
     
    	p_color.r = 1 - p_color.r;	
     
    	p_color.g = 1 - p_color.g;
     
     
    	p_color.b = 1 - p_color.b;
     
     
     
     
    	return vec4(p_color);
    }
     
    vec4 disabledColor(vec4 p_color){
    	return vec4(p_color.rgb, 0.0f);
    }
     
     
    void main()
    {
     
    	bool _disabledColor = false;
    	vec4 color = gl_Color;
     
    	/* check la couleur rouge */
    	if(color.r > 0 && key_R ){
        		color.r = 0;
        	}
    	/* check la couleur verte */
    	if(color.g > 0 && key_G ){
        		color.g = 0;
        	}
    	/* check la couleur bleu */
    	if(color.b > 0 && key_B ){
        		color.b = 0;
        	}
     
    	/* inverse les couleurs si space */
    	if(key_SPACE){
        		color = reverseColor(color);
        	}
     
     
    	gl_FragColor = color;
     
     
    }
    il link bien sans problème mais des que j'essaye de faire avec les shaders que tu ma conseiller cela reviens au même il compile bien mais des que je fait link cela provoque une erreur et l'infos de l'erreur est vide.
    Je n'arrive pas a comprendre pourquoi j'ai pas l'infos de l'erreur.

    Sa me permettrait au moin de voir le problème la je sais pas d'ou il viens.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Ce n'est peut-être qu'une impression, mais on dirait que tu essaies de rassembler des morceaux de code sans les comprendre, en espérant que çà fasse ce que tu veux. OpenGL, est suffisamment complexe pour que cette méthode ait très peu de chance de fonctionner. À mon avis, tu devrais repartir de zéro depuis un code minimal pour bien comprendre les bases d'OpenGL 3 puis ajouter progressivement la gestion d'erreur, lecture de shader depuis un fichier, chargement de textures/objets, etc...

    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
    // g++ `pkg-config --cflags --libs glew glfw3` demo_ogl3.cpp 
     
    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
     
    const char * vsCode = "#version 330 core\n"\
                           "layout(location = 0) in vec3 vertexPos;\n"\
                           "void main() { gl_Position = vec4(vertexPos, 1.0); }\n";
     
    const char * fsCode = "#version 330 core\n"\
                           "layout(location = 0) out vec3 color;\n"\
                           "void main() { color = vec3(1,0,0); }\n";
     
    GLuint LoadShaders() {
        GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
        GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
     
        glShaderSource(vertexShaderID, 1, &vsCode, NULL);
        glCompileShader(vertexShaderID);
     
        glShaderSource(fragmentShaderID, 1, &fsCode , NULL);
        glCompileShader(fragmentShaderID);
     
        GLuint ProgramID = glCreateProgram();
        glAttachShader(ProgramID, vertexShaderID);
        glAttachShader(ProgramID, fragmentShaderID);
        glLinkProgram(ProgramID);
     
        glDeleteShader(vertexShaderID);
        glDeleteShader(fragmentShaderID);
        return ProgramID;
    }
     
    int main() {
        glfwInit();
        GLFWwindow* window = glfwCreateWindow(800, 600, "demo", nullptr, nullptr);
        glfwMakeContextCurrent(window);
        glewInit();
     
        glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
     
        GLuint vertexArrayID;
        glGenVertexArrays(1, &vertexArrayID);
        glBindVertexArray(vertexArrayID);
     
        GLuint programID = LoadShaders();
     
        const GLfloat vbData[] = 
        { -1.0f, -1.0f, 0.0f,   1.0f, -1.0f, 0.0f,   0.0f, 1.0f, 0.0f, };
        GLuint vertexBuffer;
        glGenBuffers(1, &vertexBuffer);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vbData), vbData, GL_STATIC_DRAW);
     
        do {
            glClear( GL_COLOR_BUFFER_BIT );
            glUseProgram(programID);
     
            glEnableVertexAttribArray(0);
            glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
            glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
            glDrawArrays(GL_TRIANGLES, 0, 3); 
            glDisableVertexAttribArray(0);
     
            glfwSwapBuffers(window);
            glfwPollEvents();
     
        } while ( glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS 
                or glfwWindowShouldClose(window) == 0 );
     
        glDeleteBuffers(1, &vertexBuffer);
        glDeleteVertexArrays(1, &vertexArrayID);
        glDeleteProgram(programID);
        glfwTerminate();
        return 0;
    }

  10. #10
    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,

    Ce n'est peut-être qu'une impression, mais on dirait que tu essaies de rassembler des morceaux de code sans les comprendre, en espérant que çà fasse ce que tu veux.
    En faite je comprend et je sais utiliser les Shader avec OpenGL 2 et comme tu la signaler openGL 3 est vraiment différents comme j'ai pu le voir avec "Utilisation des VBO avec OpenGL 3.x". Mon problème ne se situe pas sur la non compréhension des fonctions et de l'utilisation mais d'une erreur qui est présente mais m'indique en rien le problème.

    Quand j'utilise mon petit projet fait en class de cour avec le shader cela ne fonctionnais pas non plus alors que le Shader que j'ai mi sur le post d'avant fonctionnais correctement.
    J'ai donc suivie ton conseil et repartie de zéro avec un fichier et cela fonctionne parfaitement

    J'ai donc découper le code qui marchais pas petit à petit pour trouver d'ou provient le problème car c'est exactement le même code sauf qu'il est encapsuler dans une classe.

    J'ai enfin réussie à trouver mon problème et il viens d'une 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
    49
    50
    51
    52
     
                          //////////////////////////////
                          // MACRO 
                          #define CheckedErrorGLSLProgram(x, e, m) \
    	                    (C_OGLShaderException::PrintProgramShaderError(x, e, __FILE__, __LINE__, m))
     
                          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;
     
                                             //////////////////////////////////
                                             // p_progHandle = 1
                                             // p_name         = GL_LINK_STATUS
    					CheckedGLCall(glGetProgramiv(p_progHandle, p_name, &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 number(" << 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;
    			}
    quand je link le Program directement sans passer par la MACRO cela fonctionne des que je l'utilise cela ne fonctionne pas et me renvoie aucun message d'erreur INFOS_LOG = "".
    Se que je trouve bizarre c'est que je rentre dans la MACRO et les valeur sont exactement les même que si je ne l'utilisait pas. Je rentre bien dedans le code s'exécute mais pourquoi cela ne fonctionne pas aucune idée alors que c'est exactement le même code exécuter.

    Je vais faire sans pour le moment je mis remettrais un peu plus tard mais c'est étrange comme même.

    Je te remercie de ton aide j'ai enfin trouver l'erreur en recommençant tous depuis le début

+ 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