Replace local Shader class with OpenGLShader from engine

This commit is contained in:
2026-03-16 17:29:20 +08:00
parent fee738b0b9
commit 220494c3c5

View File

@@ -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);
}