84 lines
2.4 KiB
C++

#include "shader.h"
#define GL_SILENCE_DEPRECATION
// Shader loader helper
std::string loadShaderSource(const std::string& filepath) {
std::ifstream file(filepath);
if (!file.is_open()) {
std::cerr << "Failed to open shader file: " << filepath << std::endl;
return "";
}
std::stringstream buffer;
// std::cout << "Loaded " << filepath << " successfully!\n";
buffer << file.rdbuf();
return buffer.str();
}
GLuint compileShader(GLenum type, const std::string& source) {
GLuint shader = glCreateShader(type);
const char* src = source.c_str();
glShaderSource(shader, 1, &src, nullptr);
glCompileShader(shader);
int success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
char infoLog[512];
glGetShaderInfoLog(shader, 512, nullptr, infoLog);
std::cerr << "Shader compilation failed:\n" << infoLog << std::endl;
exit(10);
}
return shader;
}
GLuint createShaderProgram(const std::string& vertexPath, const std::string& fragmentPath) {
std::string vertexSrc = loadShaderSource(vertexPath);
std::string fragmentSrc = loadShaderSource(fragmentPath);
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexSrc);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentSrc);
GLuint program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
int success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
char infoLog[512];
glGetProgramInfoLog(program, 512, nullptr, infoLog);
std::cerr << "Shader linking failed:\n" << infoLog << std::endl;
exit(11);
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
return program;
}
/* GLuint createComputeProgram(const std::string& computePath) {
std::string computeSrc = loadShaderSource(computePath);
GLuint computeShader = compileShader(GL_COMPUTE_SHADER, computeSrc);
GLuint program = glCreateProgram();
glAttachShader(program, computeShader);
glLinkProgram(program);
int success;
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (!success) {
char infoLog[512];
glGetProgramInfoLog(program, 512, nullptr, infoLog);
std::cerr << "Compute shader linking failed:\n" << infoLog << std::endl;;
}
glDeleteShader(computeShader);
return program;
} */