bool Shader::compile(GLuint &shader, GLenum type, std::string const &fichierSource) { // Création du shader shader = glCreateShader(type); // Vérification du shader if(shader == 0) { std::cout << "Erreur, le type de shader (" << type << ") n'existe pas" << std::endl; return false; } // Flux de lecture std::ifstream fichier(fichierSource.c_str()); // Test d'ouverture if(!fichier) { std::cout << "Erreur le fichier " << fichierSource << " est introuvable" << std::endl; glDeleteShader(shader); return false; } // Strings permettant de lire le code source std::string ligne; std::string codeSource; // Lecture while(getline(fichier, ligne)) { codeSource += ligne + '\n'; } // Fermeture du fichier fichier.close(); // Récupération de la chaine C du code source const GLchar* chaineCodeSource = codeSource.c_str(); // Envoi du code source au shader glShaderSource(shader, 1, &chaineCodeSource, 0); // Compilation du shader glCompileShader(shader); // Vérification de la compilation GLint erreurCompilation(0); glGetShaderiv(shader, GL_COMPILE_STATUS, &erreurCompilation); // S'il y a eu une erreur if(erreurCompilation != GL_TRUE) { // Récupération de la taille de l'erreur GLint tailleErreur(0); glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &tailleErreur); // Allocation de mémoire char *erreur = new char[tailleErreur + 1]; // Récupération de l'erreur glGetShaderInfoLog(shader, tailleErreur, &tailleErreur, erreur); erreur[tailleErreur] = '\0'; // Affichage de l'erreur std::cout << erreur << std::endl; // Libération de la mémoire et retour du booléen false delete[] erreur; glDeleteShader(shader); return false; } return true; }
bool Shader::initialiserTypeShader(GLuint &shader, GLenum type, std::string const &source) { // Génération de l'objet OpenGL Shader if(type == GL_VERTEX_SHADER) shader = glCreateShader(type); else if(type == GL_FRAGMENT_SHADER) shader = glCreateShader(GL_FRAGMENT_SHADER); else { glDeleteShader(shader); return false; } // Ouverture du fichier source std::string codeSource, ligneCodeSource; std::ifstream fichierSource(source.c_str()); // On test l'ouverture du fichier if(!fichierSource) { std::cout << "Erreur le fichier : " << source << " n'existe pas" << std::endl; glDeleteShader(shader); return false; } // Si le fichier existe et qu'il est ouvert, alors on peut lire son contenu while(getline(fichierSource, ligneCodeSource)) { codeSource += ligneCodeSource + '\n'; } fichierSource.close(); // Compilation du shader GLint erreurCompilation(0), tailleErreur(0); const GLchar* chaineCodeSource = codeSource.c_str(); glShaderSource(shader, 1, &chaineCodeSource, NULL); glCompileShader(shader); // Vérification de la compilation glGetShaderiv(shader, GL_COMPILE_STATUS, &erreurCompilation); if(erreurCompilation != GL_TRUE) { // Récupération de la taille de l'erreur glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &tailleErreur); // Allocation d'une chaine de caractères char *erreur = new char[tailleErreur + 1]; erreur[tailleErreur] = '\0'; // Récupération de l'erreur glGetShaderInfoLog(shader, tailleErreur, &tailleErreur, erreur); // Affichage de l'erreur std::cout << "Erreur de compilation du shader (" << type << ") " << erreur << std::endl; // On libère la mémoire et on retourne false delete[] erreur; return false; } // Tout s'est bien passé on retourne true return true; }