From 220494c3c5740445413f62128bb7551df4b7ca93 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Mon, 16 Mar 2026 17:29:20 +0800 Subject: [PATCH] Replace local Shader class with OpenGLShader from engine --- tests/OpenGL/main.cpp | 133 ++++++------------------------------------ 1 file changed, 18 insertions(+), 115 deletions(-) diff --git a/tests/OpenGL/main.cpp b/tests/OpenGL/main.cpp index da42cf00..77e99adf 100644 --- a/tests/OpenGL/main.cpp +++ b/tests/OpenGL/main.cpp @@ -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); }