1
0
Fork 0
2019-ecs/Source/Graphics/Shader.cpp

85 lines
2.0 KiB
C++

#include "Shader.hpp"
#include <fstream>
#include <iostream>
#include <sstream>
Shader::Shader(std::string const& vertexPath, std::string const& fragmentPath)
{
std::string fragmentFileContents;
std::string vertexFileContents;
// Read in the vertex shader
std::ifstream vertex_file;
vertex_file.open(vertexPath);
std::stringstream vertex_file_stream;
vertex_file_stream << vertex_file.rdbuf();
vertex_file.close();
vertexFileContents = vertex_file_stream.str();
// Read in the fragment shader
std::ifstream fragment_file;
fragment_file.open(fragmentPath);
std::stringstream fragment_file_stream;
fragment_file_stream << fragment_file.rdbuf();
fragment_file.close();
fragmentFileContents = fragment_file_stream.str();
GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
const GLchar* vertex_shader_source = vertexFileContents.c_str();
glShaderSource(vertex_shader, 1, &vertex_shader_source, nullptr);
glCompileShader(vertex_shader);
int success;
char infoLog[512];
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertex_shader, 512, nullptr, infoLog);
std::cerr << "Error compiling vertex shader: " << infoLog << "\n";
}
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar* fragment_shader_source = fragmentFileContents.c_str();
glShaderSource(fragment_shader, 1, &fragment_shader_source, nullptr);
glCompileShader(fragment_shader);
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragment_shader, 512, nullptr, infoLog);
std::cerr << "Error compiling fragment shader: " << infoLog << "\n";
}
mId = glCreateProgram();
glAttachShader(mId, vertex_shader);
glAttachShader(mId, fragment_shader);
glLinkProgram(mId);
glGetProgramiv(mId, GL_LINK_STATUS, &success);
if (!success)
{
glGetProgramInfoLog(mId, 512, nullptr, infoLog);
std::cerr << "Error linking shaders: " << infoLog << "\n";
}
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
}
void Shader::Activate()
{
glUseProgram(mId);
}