mirror of
https://github.com/guezoloic/LearnOpenGL.git
synced 2026-01-25 06:34:14 +00:00
feat(shader)!: rework shader class
- rename IDs - replace constructor without doing anything - add compile function (it was the older constructor method)
This commit is contained in:
@@ -6,19 +6,29 @@
|
|||||||
class Shader
|
class Shader
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
GLuint vertexShader;
|
GLuint vertexShaderID; // vertex shader id
|
||||||
GLuint fragmentShader;
|
GLuint fragmentShaderID; // fragment shader id
|
||||||
GLuint shaderProgram;
|
|
||||||
|
|
||||||
void addVertShader(const char* vertexShaderSource);
|
// final compiled shader program id used by the gpu
|
||||||
void addFragShader(const char* fragmentShaderSource);
|
GLuint shaderProgramID;
|
||||||
|
|
||||||
|
// compile vertex shader source code
|
||||||
|
void addVertShader(const char* vertexSource);
|
||||||
|
// compile fragment shader source code
|
||||||
|
void addFragShader(const char* fragmentSource);
|
||||||
|
// link both compile vertex and fragment shader
|
||||||
void compileInProgram();
|
void compileInProgram();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Shader(const char* vertexShaderSource, const char* fragmentShaderSource);
|
// Does nothing apart initializing all IDs to 0
|
||||||
|
Shader();
|
||||||
|
// compile and link vertex and fragment into the shader struct
|
||||||
|
void compile(const char* vertexSource, const char* fragmentSource);
|
||||||
|
// free shader program
|
||||||
~Shader();
|
~Shader();
|
||||||
|
|
||||||
GLuint getProgram() const;
|
GLuint getShaderProgramID() const;
|
||||||
|
// activate shader program into gpu pipeline
|
||||||
void use() const;
|
void use() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +1,86 @@
|
|||||||
#include "shader.hpp"
|
#include "shader.hpp"
|
||||||
|
|
||||||
Shader::Shader(const char* vertexShaderSource, const char* fragmentShaderSource)
|
#include <iostream>
|
||||||
|
|
||||||
|
Shader::Shader() : shaderProgramID(0), vertexShaderID(0), fragmentShaderID(0) {}
|
||||||
|
|
||||||
|
void Shader::compile(const char* vertexSource, const char* fragmentSource)
|
||||||
{
|
{
|
||||||
vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
if (this->shaderProgramID != 0) glDeleteProgram(this->shaderProgramID);
|
||||||
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
||||||
shaderProgram = glCreateProgram();
|
|
||||||
|
|
||||||
addVertShader(vertexShaderSource);
|
this->vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
|
||||||
addFragShader(fragmentShaderSource);
|
this->fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
this->shaderProgramID = glCreateProgram();
|
||||||
|
|
||||||
compileInProgram();
|
this->addVertShader(vertexSource);
|
||||||
|
this->addFragShader(fragmentSource);
|
||||||
|
|
||||||
|
this->compileInProgram();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::addVertShader(const char* vertexShaderSource)
|
void Shader::addVertShader(const char* vertexSource)
|
||||||
{
|
{
|
||||||
glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);
|
glShaderSource(this->vertexShaderID, 1, &vertexSource, nullptr);
|
||||||
glCompileShader(vertexShader);
|
glCompileShader(this->vertexShaderID);
|
||||||
|
|
||||||
|
GLint success;
|
||||||
|
glGetShaderiv(this->vertexShaderID, GL_COMPILE_STATUS, &success);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
GLchar infoLog[1024];
|
||||||
|
glGetShaderInfoLog(this->vertexShaderID, 1024, nullptr, infoLog);
|
||||||
|
|
||||||
|
std::cerr << "ERROR(SHADER): VERTEX COMPILATION FAILED (ID "
|
||||||
|
<< this->vertexShaderID << ")\n"
|
||||||
|
<< infoLog << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::addFragShader(const char* fragmentShaderSource)
|
void Shader::addFragShader(const char* fragmentSource)
|
||||||
{
|
{
|
||||||
glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);
|
glShaderSource(this->fragmentShaderID, 1, &fragmentSource, nullptr);
|
||||||
glCompileShader(fragmentShader);
|
glCompileShader(this->fragmentShaderID);
|
||||||
|
|
||||||
|
GLint success;
|
||||||
|
glGetShaderiv(this->fragmentShaderID, GL_COMPILE_STATUS, &success);
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
GLchar infoLog[1024];
|
||||||
|
glGetShaderInfoLog(this->fragmentShaderID, 1024, nullptr, infoLog);
|
||||||
|
|
||||||
|
std::cerr << "ERROR(SHADER): FRAGMENT COMPILATION FAILED (ID "
|
||||||
|
<< this->fragmentShaderID << ")\n"
|
||||||
|
<< infoLog << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Shader::compileInProgram()
|
void Shader::compileInProgram()
|
||||||
{
|
{
|
||||||
glAttachShader(shaderProgram, vertexShader);
|
glAttachShader(this->shaderProgramID, this->vertexShaderID);
|
||||||
glAttachShader(shaderProgram, fragmentShader);
|
glAttachShader(this->shaderProgramID, this->fragmentShaderID);
|
||||||
glLinkProgram(shaderProgram);
|
glLinkProgram(this->shaderProgramID);
|
||||||
|
|
||||||
glDetachShader(shaderProgram, vertexShader);
|
GLint success;
|
||||||
glDetachShader(shaderProgram, fragmentShader);
|
glGetProgramiv(this->shaderProgramID, GL_LINK_STATUS, &success);
|
||||||
glDeleteShader(vertexShader);
|
if (!success)
|
||||||
glDeleteShader(fragmentShader);
|
{
|
||||||
|
GLchar infoLog[1024];
|
||||||
|
glGetProgramInfoLog(this->shaderProgramID, 1024, nullptr, infoLog);
|
||||||
|
|
||||||
|
std::cerr << "ERROR(SHADER): LINKING FAILED (Program ID "
|
||||||
|
<< this->shaderProgramID << ")\n"
|
||||||
|
<< infoLog << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
glDetachShader(this->shaderProgramID, this->vertexShaderID);
|
||||||
|
glDetachShader(this->shaderProgramID, this->fragmentShaderID);
|
||||||
|
|
||||||
|
glDeleteShader(this->vertexShaderID);
|
||||||
|
glDeleteShader(this->fragmentShaderID);
|
||||||
}
|
}
|
||||||
|
|
||||||
Shader::~Shader() { glDeleteProgram(shaderProgram); }
|
Shader::~Shader() { glDeleteProgram(this->shaderProgramID); }
|
||||||
|
|
||||||
void Shader::use() const { glUseProgram(shaderProgram); }
|
void Shader::use() const { glUseProgram(this->shaderProgramID); }
|
||||||
|
|
||||||
GLuint Shader::getProgram() const { return shaderProgram; }
|
GLuint Shader::getShaderProgramID() const { return this->shaderProgramID; }
|
||||||
Reference in New Issue
Block a user