#include "Shader_Loader.h" #include #include #include using namespace Core; Shader_Loader::Shader_Loader(void){} Shader_Loader::~Shader_Loader(void){} std::string Shader_Loader::ReadShader(char *filename) { std::string shaderCode; std::ifstream file(filename, std::ios::in); if (!file.good()) { std::cout << "Can't read file " << filename << std::endl; std::terminate(); } file.seekg(0, std::ios::end); shaderCode.resize((unsigned int)file.tellg()); file.seekg(0, std::ios::beg); file.read(&shaderCode[0], shaderCode.size()); file.close(); return shaderCode; } GLuint Shader_Loader::CreateShader(GLenum shaderType, std::string source, char* shaderName) { int compile_result = 0; GLuint shader = glCreateShader(shaderType); const char *shader_code_ptr = source.c_str(); const int shader_code_size = source.size(); glShaderSource(shader, 1, &shader_code_ptr, &shader_code_size); glCompileShader(shader); glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_result); //sprawdz bledy if (compile_result == GL_FALSE) { int info_log_length = 0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &info_log_length); std::vector shader_log(info_log_length); glGetShaderInfoLog(shader, info_log_length, NULL, &shader_log[0]); std::cout << "ERROR compiling shader: " << shaderName << std::endl << &shader_log[0] << std::endl; return 0; } return shader; } GLuint Shader_Loader::CreateProgram(char* vertexShaderFilename, char* fragmentShaderFilename) { //wczytaj shadery std::string vertex_shader_code = ReadShader(vertexShaderFilename); std::string fragment_shader_code = ReadShader(fragmentShaderFilename); GLuint vertex_shader = CreateShader(GL_VERTEX_SHADER, vertex_shader_code, "vertex shader"); GLuint fragment_shader = CreateShader(GL_FRAGMENT_SHADER, fragment_shader_code, "fragment shader"); int link_result = 0; //stworz shader GLuint program = glCreateProgram(); glAttachShader(program, vertex_shader); glAttachShader(program, fragment_shader); glLinkProgram(program); glGetProgramiv(program, GL_LINK_STATUS, &link_result); //sprawdz bledy w linkerze if (link_result == GL_FALSE) { int info_log_length = 0; glGetProgramiv(program, GL_INFO_LOG_LENGTH, &info_log_length); std::vector program_log(info_log_length); glGetProgramInfoLog(program, info_log_length, NULL, &program_log[0]); std::cout << "Shader Loader : LINK ERROR" << std::endl << &program_log[0] << std::endl; return 0; } glDetachShader(program, vertex_shader); glDetachShader(program, fragment_shader); glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); return program; } void Shader_Loader::DeleteProgram( GLuint program ) { glDeleteProgram(program); }