Replace local Shader class with OpenGLShader from engine
This commit is contained in:
@@ -17,8 +17,10 @@
|
||||
#include "XCEngine/Debug/Logger.h"
|
||||
#include "XCEngine/Debug/ConsoleLogSink.h"
|
||||
#include "XCEngine/Debug/FileLogSink.h"
|
||||
#include "XCEngine/RHI/OpenGL/OpenGLShader.h"
|
||||
|
||||
using namespace XCEngine::Debug;
|
||||
using namespace XCEngine::RHI;
|
||||
|
||||
#pragma comment(lib, "opengl32.lib")
|
||||
#pragma comment(lib, "gdi32.lib")
|
||||
@@ -36,106 +38,6 @@ void Log(const char* format, ...) {
|
||||
Logger::Get().Debug(LogCategory::Rendering, buffer);
|
||||
}
|
||||
|
||||
class Shader
|
||||
{
|
||||
public:
|
||||
unsigned int ID;
|
||||
|
||||
Shader() : ID(0) {}
|
||||
|
||||
Shader(const char* vertexPath, const char* fragmentPath)
|
||||
{
|
||||
std::string vertexCode, fragmentCode;
|
||||
std::ifstream vShaderFile(vertexPath), fShaderFile(fragmentPath);
|
||||
vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||
fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||
try
|
||||
{
|
||||
std::stringstream vShaderStream, fShaderStream;
|
||||
vShaderStream << vShaderFile.rdbuf();
|
||||
fShaderStream << fShaderFile.rdbuf();
|
||||
vShaderFile.close();
|
||||
fShaderFile.close();
|
||||
vertexCode = vShaderStream.str();
|
||||
fragmentCode = fShaderStream.str();
|
||||
}
|
||||
catch (std::ifstream::failure& e)
|
||||
{
|
||||
Log("ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ: %s", e.what());
|
||||
}
|
||||
|
||||
const char* vShaderCode = vertexCode.c_str();
|
||||
const char* fShaderCode = fragmentCode.c_str();
|
||||
|
||||
unsigned int vertex = glCreateShader(GL_VERTEX_SHADER);
|
||||
glShaderSource(vertex, 1, &vShaderCode, NULL);
|
||||
glCompileShader(vertex);
|
||||
checkCompileErrors(vertex, "VERTEX");
|
||||
|
||||
unsigned int fragment = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||
glCompileShader(fragment);
|
||||
checkCompileErrors(fragment, "FRAGMENT");
|
||||
|
||||
ID = glCreateProgram();
|
||||
glAttachShader(ID, vertex);
|
||||
glAttachShader(ID, fragment);
|
||||
glLinkProgram(ID);
|
||||
checkCompileErrors(ID, "PROGRAM");
|
||||
|
||||
glDeleteShader(vertex);
|
||||
glDeleteShader(fragment);
|
||||
}
|
||||
|
||||
void use() { glUseProgram(ID); }
|
||||
|
||||
void setInt(const std::string& name, int value) const
|
||||
{
|
||||
glUniform1i(glGetUniformLocation(ID, name.c_str()), value);
|
||||
}
|
||||
void setFloat(const std::string& name, float value) const
|
||||
{
|
||||
glUniform1f(glGetUniformLocation(ID, name.c_str()), value);
|
||||
}
|
||||
void setVec3(const std::string& name, const glm::vec3& value) const
|
||||
{
|
||||
glUniform3fv(glGetUniformLocation(ID, name.c_str()), 1, &value[0]);
|
||||
}
|
||||
void setVec3(const std::string& name, float x, float y, float z) const
|
||||
{
|
||||
glUniform3f(glGetUniformLocation(ID, name.c_str()), x, y, z);
|
||||
}
|
||||
void setMat4(const std::string& name, const glm::mat4& mat) const
|
||||
{
|
||||
glUniformMatrix4fv(glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
|
||||
}
|
||||
|
||||
private:
|
||||
void checkCompileErrors(GLuint shader, std::string type)
|
||||
{
|
||||
GLint success;
|
||||
GLchar infoLog[1024];
|
||||
if (type != "PROGRAM")
|
||||
{
|
||||
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(shader, 1024, NULL, infoLog);
|
||||
Log("ERROR::SHADER_COMPILATION_ERROR: %s - %s", type.c_str(), infoLog);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
glGetProgramiv(ID, GL_LINK_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetProgramInfoLog(ID, 1024, NULL, infoLog);
|
||||
Log("ERROR::PROGRAM_LINKING_ERROR: %s", infoLog);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct Vertex
|
||||
{
|
||||
glm::vec3 Position;
|
||||
@@ -166,7 +68,7 @@ public:
|
||||
setupMesh();
|
||||
}
|
||||
|
||||
void Draw(Shader* shader)
|
||||
void Draw(OpenGLShader* shader)
|
||||
{
|
||||
unsigned int diffuseNr = 1;
|
||||
unsigned int specularNr = 1;
|
||||
@@ -181,7 +83,7 @@ public:
|
||||
else if (name == "texture_specular")
|
||||
number = std::to_string(specularNr++);
|
||||
|
||||
glUniform1i(glGetUniformLocation(shader->ID, ("material." + name + number).c_str()), i);
|
||||
glUniform1i(glGetUniformLocation(shader->GetID(), ("material." + name + number).c_str()), i);
|
||||
glBindTexture(GL_TEXTURE_2D, textures[i].id);
|
||||
}
|
||||
|
||||
@@ -259,7 +161,7 @@ public:
|
||||
loadModel(path);
|
||||
}
|
||||
|
||||
void Draw(Shader* shader)
|
||||
void Draw(OpenGLShader* shader)
|
||||
{
|
||||
for (auto& mesh : meshes)
|
||||
mesh.Draw(shader);
|
||||
@@ -357,7 +259,7 @@ private:
|
||||
};
|
||||
|
||||
Model* model = nullptr;
|
||||
Shader* shader = nullptr;
|
||||
OpenGLShader* shader = nullptr;
|
||||
int frameCount = 0;
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||
@@ -376,7 +278,8 @@ void Initialize()
|
||||
Log("OpenGL Test Application Started");
|
||||
|
||||
model = new Model("res/models/backpack/backpack.obj");
|
||||
shader = new Shader("Shaders/vertexshader.glsl", "Shaders/fragmentshader.glsl");
|
||||
shader = new OpenGLShader();
|
||||
shader->CompileFromFile("Shaders/vertexshader.glsl", "Shaders/fragmentshader.glsl");
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
Log("Initialization complete");
|
||||
@@ -417,21 +320,21 @@ void Render()
|
||||
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
shader->use();
|
||||
shader->Use();
|
||||
|
||||
glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
|
||||
glm::mat4 modelMat = glm::mat4(1.0f);
|
||||
glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 3), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
|
||||
|
||||
shader->setMat4("view", view);
|
||||
shader->setMat4("model", modelMat);
|
||||
shader->setMat4("projection", projection);
|
||||
shader->setVec3("viewPos", 0.0f, 0.0f, 3.0f);
|
||||
shader->setFloat("material.shininess", 32.0f);
|
||||
shader->setVec3("dirLight.direction", 0.0f, -1.0f, 0.0f);
|
||||
shader->setVec3("dirLight.ambient", 0.3f, 0.3f, 0.3f);
|
||||
shader->setVec3("dirLight.diffuse", 0.8f, 0.8f, 0.8f);
|
||||
shader->setVec3("dirLight.specular", 0.5f, 0.5f, 0.5f);
|
||||
shader->SetMat4("view", &view[0][0]);
|
||||
shader->SetMat4("model", &modelMat[0][0]);
|
||||
shader->SetMat4("projection", &projection[0][0]);
|
||||
shader->SetVec3("viewPos", 0.0f, 0.0f, 3.0f);
|
||||
shader->SetFloat("material.shininess", 32.0f);
|
||||
shader->SetVec3("dirLight.direction", 0.0f, -1.0f, 0.0f);
|
||||
shader->SetVec3("dirLight.ambient", 0.3f, 0.3f, 0.3f);
|
||||
shader->SetVec3("dirLight.diffuse", 0.8f, 0.8f, 0.8f);
|
||||
shader->SetVec3("dirLight.specular", 0.5f, 0.5f, 0.5f);
|
||||
|
||||
model->Draw(shader);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user