Ejemplo n.º 1
0
    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;
    }
Ejemplo n.º 2
0
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;
}