123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- #include "Shader.h"
- Shader::Shader() : m_vertexID(0), m_fragmentID(0), m_programID(0), m_vertexSource(), m_fragmentSource()
- {
- }
- Shader::Shader(Shader const &shaderACopier)
- {
-
- m_vertexSource = shaderACopier.m_vertexSource;
- m_fragmentSource = shaderACopier.m_fragmentSource;
-
- charger();
- }
- Shader::Shader(std::string vertexSource, std::string fragmentSource) : m_vertexID(0), m_fragmentID(0), m_programID(0),
- m_vertexSource(vertexSource), m_fragmentSource(fragmentSource)
- {
- }
- Shader::~Shader()
- {
-
- glDeleteShader(m_vertexID);
- glDeleteShader(m_fragmentID);
- glDeleteProgram(m_programID);
- }
- Shader& Shader::operator=(Shader const &shaderACopier)
- {
-
- m_vertexSource = shaderACopier.m_vertexSource;
- m_fragmentSource = shaderACopier.m_fragmentSource;
-
- charger();
-
- return *this;
- }
- bool Shader::charger()
- {
-
- if(glIsShader(m_vertexID) == GL_TRUE)
- glDeleteShader(m_vertexID);
- if(glIsShader(m_fragmentID) == GL_TRUE)
- glDeleteShader(m_fragmentID);
- if(glIsProgram(m_programID) == GL_TRUE)
- glDeleteProgram(m_programID);
-
- if(!compilerShader(m_vertexID, GL_VERTEX_SHADER, m_vertexSource))
- return false;
- if(!compilerShader(m_fragmentID, GL_FRAGMENT_SHADER, m_fragmentSource))
- return false;
-
- m_programID = glCreateProgram();
-
- glAttachShader(m_programID, m_vertexID);
- glAttachShader(m_programID, m_fragmentID);
-
- glBindAttribLocation(m_programID, 0, "in_Vertex");
- glBindAttribLocation(m_programID, 1, "in_Color");
- glBindAttribLocation(m_programID, 2, "in_TexCoord0");
-
- glLinkProgram(m_programID);
-
- GLint erreurLink(0);
- glGetProgramiv(m_programID, GL_LINK_STATUS, &erreurLink);
-
- if(erreurLink != GL_TRUE)
- {
-
- GLint tailleErreur(0);
- glGetProgramiv(m_programID, GL_INFO_LOG_LENGTH, &tailleErreur);
-
- char *erreur = new char[tailleErreur + 1];
-
- glGetShaderInfoLog(m_programID, tailleErreur, &tailleErreur, erreur);
- erreur[tailleErreur] = '\0';
-
- std::cout << erreur << std::endl;
-
- delete[] erreur;
- glDeleteProgram(m_programID);
- return false;
- }
-
- else
- return true;
- }
- bool Shader::compilerShader(GLuint &shader, GLenum type, std::string const &fichierSource)
- {
-
- shader = glCreateShader(type);
-
- if(shader == 0)
- {
- std::cout << "Erreur, le type de shader (" << type << ") n'existe pas" << std::endl;
- return false;
- }
-
- std::ifstream fichier(fichierSource.c_str());
-
- if(!fichier)
- {
- std::cout << "Erreur le fichier " << fichierSource << " est introuvable" << std::endl;
- glDeleteShader(shader);
- return false;
- }
-
- std::string ligne;
- std::string codeSource;
-
- while(getline(fichier, ligne))
- codeSource += ligne + '\n';
-
- fichier.close();
-
- const GLchar* chaineCodeSource = codeSource.c_str();
-
- glShaderSource(shader, 1, &chaineCodeSource, 0);
-
- glCompileShader(shader);
-
- GLint erreurCompilation(0);
- glGetShaderiv(shader, GL_COMPILE_STATUS, &erreurCompilation);
-
- if(erreurCompilation != GL_TRUE)
- {
-
- GLint tailleErreur(0);
- glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &tailleErreur);
-
- char *erreur = new char[tailleErreur + 1];
-
- glGetShaderInfoLog(shader, tailleErreur, &tailleErreur, erreur);
- erreur[tailleErreur] = '\0';
-
- std::cout << erreur << std::endl;
-
- delete[] erreur;
- glDeleteShader(shader);
- return false;
- }
-
- else
- return true;
- }
- GLuint Shader::getProgramID() const
- {
- return m_programID;
- }
|