#include "ShaderMaker.h" #include #include /* PORCATA AGGIUNTA IN SEGUITO */ #include using namespace std; char* ShaderMaker::readShaderSource(const char* shaderFile) { FILE* fp = fopen(shaderFile, "rb"); if (fp == NULL) { return NULL; } fseek(fp, 0L, SEEK_END); long size = ftell(fp); fseek(fp, 0L, SEEK_SET); char* buf = new char[size + 1]; fread(buf, 1, size, fp); buf[size] = '\0'; fclose(fp); return buf; } GLuint ShaderMaker::createProgram(char* vertexfilename, char *fragmentfilename) { GLenum ErrorCheckValue = glGetError(); // Creiamo gli eseguibili degli shader //Leggiamo il codice del Vertex Shader GLchar* VertexShader = readShaderSource(vertexfilename); //Visualizzo sulla console il CODICE VERTEX SHADER std::cout << VertexShader; std::cout << "MACHEOH\n\n\n\n" << std::endl; //Generiamo un identificativo per il vertex shader GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER); //Associamo all'identificativo il codice del vertex shader glShaderSource(vertexShaderId, 1, (const char**)&VertexShader, NULL); //Compiliamo il Vertex SHader glCompileShader(vertexShaderId); int success; GLchar infoLog[512]; int logLength; glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &success); if ( GL_TRUE != success) { glGetShaderInfoLog(vertexShaderId, 512, &logLength, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } //Leggiamo il codice del Fragment Shader const GLchar* FragmentShader = readShaderSource(fragmentfilename); //Visualizzo sulla console il CODICE FRAGMENT SHADER std::cout << FragmentShader; //Generiamo un identificativo per il FRAGMENT shader GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShaderId, 1, (const char**)&FragmentShader, NULL); //Compiliamo il FRAGMENT SHader glCompileShader(fragmentShaderId); glGetShaderiv(fragmentShaderId, GL_COMPILE_STATUS, &success); if ( GL_TRUE != success) { glGetShaderInfoLog(fragmentShaderId, 512, &logLength, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } ErrorCheckValue = glGetError(); cout << ErrorCheckValue; if (ErrorCheckValue != GL_NO_ERROR) { fprintf( stderr, "ERROR: Could not create the shaders: %s | %x\n", "(FIX MY SOURCE)", ErrorCheckValue ); exit(-1); } //Creiamo un identificativo di un eseguibile e gli colleghiamo i due shader compilati GLuint programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glLinkProgram(programId); return programId; }