From 86c01377e5cbff893be5352108c2c1e5024a5ee3 Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Tue, 20 Feb 2024 23:42:19 +1100 Subject: [PATCH] add multisampling --- assets/shader/blur.fsh | 26 ++++++++++++++ assets/shader/blur.vsh | 14 ++++++++ assets/shader/main.vsh | 2 +- src/coolant/fluid.hpp | 2 +- src/graphics/mesh/font.cpp | 4 +-- src/graphics/mesh/glmesh.cpp | 4 +-- src/graphics/resize.cpp | 1 + src/graphics/shader.cpp | 67 +++++++++++++++++++++++++----------- src/graphics/shader.hpp | 30 ++++++++++++---- src/graphics/ui.cpp | 4 +-- src/graphics/window.cpp | 19 ++++++---- 11 files changed, 130 insertions(+), 43 deletions(-) create mode 100644 assets/shader/blur.fsh create mode 100644 assets/shader/blur.vsh diff --git a/assets/shader/blur.fsh b/assets/shader/blur.fsh new file mode 100644 index 0000000..14d3baf --- /dev/null +++ b/assets/shader/blur.fsh @@ -0,0 +1,26 @@ + +#version 460 core + +uniform int samples; +uniform sampler2D tex; + +in vec2 texPos; + +out vec4 FragColour; + +void main() +{ + vec2 texel_size = 1.f / vec2(textureSize(tex, 0)); + float samples_n = pow(samples * 2 + 1, 2); + vec4 colour; + + for(int x = -samples; x <= samples; x++) + for(int y = -samples; y <= samples; y++) + { + vec2 off = texel_size * vec2(x, y); + colour += texture2D(tex, texPos + off); + } + + FragColour = vec4((colour / samples_n).rgb, 1); +} + diff --git a/assets/shader/blur.vsh b/assets/shader/blur.vsh new file mode 100644 index 0000000..eea7bfb --- /dev/null +++ b/assets/shader/blur.vsh @@ -0,0 +1,14 @@ + +#version 460 core + +layout (location = 1) in vec2 aTexPos; +layout (location = 2) in vec4 aPos; + +out vec2 texPos; + +void main() +{ + texPos = aTexPos; + gl_Position = aPos; +} + diff --git a/assets/shader/main.vsh b/assets/shader/main.vsh index b8ba7bc..20bcc4e 100644 --- a/assets/shader/main.vsh +++ b/assets/shader/main.vsh @@ -19,8 +19,8 @@ out vec2 texPos; void main() { vec4 pos = camera * model * aPos; - vec3 cNormal = vec3(0.f, 0.f, 1.f) * mat3(camera * model); +// vec3 cNormal = vec3(0.f, 0.f, 1.f) * mat3(camera * model); // float brightness = dot(normalize(aNormal), normalize(cNormal)) * 0.25f + 0.75f; colour = aColour;// * vec4(vec3(brightness), 1); diff --git a/src/coolant/fluid.hpp b/src/coolant/fluid.hpp index 9f7883b..4a39809 100644 --- a/src/coolant/fluid.hpp +++ b/src/coolant/fluid.hpp @@ -53,7 +53,7 @@ struct Fluid constexpr double l_to_mol(double l) const { return g_to_mol(l_to_g(l)); } }; -constexpr const Fluid WATER = Fluid(1000, 18, 2257, {8.07131 + 2.124903, 1730.63, 233.426 - 273.15}); +constexpr Fluid WATER = Fluid(1000, 18, 2257, {8.07131 + 2.124903, 1730.63, 233.426 - 273.15}); } diff --git a/src/graphics/mesh/font.cpp b/src/graphics/mesh/font.cpp index 60afcc5..06be357 100644 --- a/src/graphics/mesh/font.cpp +++ b/src/graphics/mesh/font.cpp @@ -81,8 +81,8 @@ void Font::init() glTextureParameteri(texids[i], GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTextureParameteri(texids[i], GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTextureParameteri(texids[i], GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTextureParameteri(texids[i], GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTextureParameteri(texids[i], GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTextureParameteri(texids[i], GL_TEXTURE_MAG_FILTER, GL_LINEAR); c.handle = glGetTextureHandleARB(texids[i]); glMakeTextureHandleResidentARB(c.handle); diff --git a/src/graphics/mesh/glmesh.cpp b/src/graphics/mesh/glmesh.cpp index 06ca8dd..1873427 100644 --- a/src/graphics/mesh/glmesh.cpp +++ b/src/graphics/mesh/glmesh.cpp @@ -59,8 +59,8 @@ void GLMesh::bind() void GLMesh::uniform() { - glUniformMatrix4fv(Shader::gl_model, 1, false, &model_matrix[0][0]); - glUniformMatrix4fv(Shader::gl_tex_mat, 1, false, &colour_matrix[0][0]); + glUniformMatrix4fv(Shader::MAIN["model"], 1, false, &model_matrix[0][0]); + glUniformMatrix4fv(Shader::MAIN["tex_mat"], 1, false, &colour_matrix[0][0]); } void GLMesh::set(const Mesh& m, int mode) diff --git a/src/graphics/resize.cpp b/src/graphics/resize.cpp index ea7fe3d..888a794 100644 --- a/src/graphics/resize.cpp +++ b/src/graphics/resize.cpp @@ -6,6 +6,7 @@ #include "window.hpp" using namespace Sim::Graphics; +using namespace Sim::Graphics::Resize; static bool is_fullscreen = false; diff --git a/src/graphics/shader.cpp b/src/graphics/shader.cpp index 14d6339..d98c282 100644 --- a/src/graphics/shader.cpp +++ b/src/graphics/shader.cpp @@ -11,13 +11,8 @@ using namespace Sim::Graphics; -static unsigned int prog_id; - -int Shader::gl_tex_mat; -int Shader::gl_model; -int Shader::gl_camera; -int Shader::gl_projection; -int Shader::gl_brightness; +Shader Shader::MAIN; +Shader Shader::BLUR; static int load_shader(const char* src, int type) { @@ -44,11 +39,32 @@ static std::string read_shader(const char* path) return ss.str(); } -unsigned int Shader::init_program() +Shader::Shader() { - std::string shader_vsh = read_shader("../assets/shader/main.vsh"); - std::string shader_fsh = read_shader("../assets/shader/main.fsh"); - + +} + +Shader::Shader(Shader&& o) +{ + prog_id = o.prog_id; + o.prog_id = 0; +} + +Shader::~Shader() +{ + if(prog_id) + { + glDeleteProgram(prog_id); + } +} + +void Shader::load(const char* path, const char* file_vsh, const char* file_fsh) +{ + std::string path_vsh = std::string(path) + "/" + std::string(file_vsh); + std::string path_fsh = std::string(path) + "/" + std::string(file_fsh); + std::string shader_vsh = read_shader(path_vsh.c_str()); + std::string shader_fsh = read_shader(path_fsh.c_str()); + int success; int vsh_id = load_shader(shader_vsh.c_str(), GL_VERTEX_SHADER); int fsh_id = load_shader(shader_fsh.c_str(), GL_FRAGMENT_SHADER); @@ -63,21 +79,30 @@ unsigned int Shader::init_program() { char infoLog[512]; glGetProgramInfoLog(prog_id, 512, NULL, infoLog); - std::cout << "Shader Link Error: " << infoLog << std::endl; + std::cout << "Shader Link Error (" << path << "," << file_vsh << "," << file_fsh << "): " << infoLog << std::endl; Window::close(); - return 0; + return; } - - gl_tex_mat = glGetUniformLocation(prog_id, "tex_mat"); - gl_model = glGetUniformLocation(prog_id, "model"); - gl_camera = glGetUniformLocation(prog_id, "camera"); - gl_projection = glGetUniformLocation(prog_id, "projection"); - gl_brightness = glGetUniformLocation(prog_id, "brightness"); glUseProgram(prog_id); glDeleteShader(vsh_id); glDeleteShader(fsh_id); - - return prog_id; +} + +void Shader::use() +{ + glUseProgram(prog_id); +} + +unsigned int Shader::operator [](const char* pos) +{ + auto it = uniform_locations.find(pos); + + if(it != uniform_locations.end()) + { + return it->second; + } + + return uniform_locations[pos] = glGetUniformLocation(prog_id, pos); } diff --git a/src/graphics/shader.hpp b/src/graphics/shader.hpp index 01ed939..af12c7e 100644 --- a/src/graphics/shader.hpp +++ b/src/graphics/shader.hpp @@ -1,16 +1,32 @@ #pragma once -namespace Sim::Graphics::Shader +#include + +namespace Sim::Graphics { -extern int gl_tex_mat; -extern int gl_model; -extern int gl_camera; -extern int gl_projection; -extern int gl_brightness; +class Shader +{ + unsigned int prog_id = 0; -unsigned int init_program(); + std::unordered_map uniform_locations; + +public: + + static Shader MAIN; + static Shader BLUR; + + Shader(); + Shader(const Shader& o) = delete; + Shader(Shader&& o); + ~Shader(); + + void load(const char* path, const char* file_vsh, const char* file_fsh); + void use(); + + unsigned int operator[](const char* pos); +}; }; diff --git a/src/graphics/ui.cpp b/src/graphics/ui.cpp index 36a3a16..62aee5d 100644 --- a/src/graphics/ui.cpp +++ b/src/graphics/ui.cpp @@ -55,8 +55,8 @@ void UI::render() glm::mat4 mat_projection = glm::mat4(1); glm::mat4 mat_camera = glm::scale(glm::mat4(1), glm::vec3(1.0f / wsize * glm::vec2(1, -1), -1)); - glUniformMatrix4fv(Shader::gl_projection, 1, false, &mat_projection[0][0]); - glUniformMatrix4fv(Shader::gl_camera, 1, false, &mat_camera[0][0]); + glUniformMatrix4fv(Shader::MAIN["projection"], 1, false, &mat_projection[0][0]); + glUniformMatrix4fv(Shader::MAIN["camera"], 1, false, &mat_camera[0][0]); s_mesh.bind(); s_mesh.uniform(); diff --git a/src/graphics/window.cpp b/src/graphics/window.cpp index 3011b22..2b65def 100644 --- a/src/graphics/window.cpp +++ b/src/graphics/window.cpp @@ -34,6 +34,7 @@ static GLFWwindow* win; static bool win_should_close = false; static GLMesh mesh_scene; + static Monitor::Vessel monitor_vessel; static Monitor::Core monitor_core; static Monitor::PrimaryLoop monitor_primary_loop; @@ -42,7 +43,7 @@ static Monitor::Turbine monitor_turbine; glm::mat4 Window::projection_matrix; -void GLAPIENTRY cb_debug_message(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) +static void GLAPIENTRY cb_debug_message(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) { if(severity != GL_DEBUG_SEVERITY_NOTIFICATION) { @@ -58,6 +59,7 @@ void Window::create() glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, true); glfwWindowHint(GLFW_VISIBLE, false); + glfwWindowHint(GLFW_SAMPLES, 16); #ifdef __APPLE__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true); @@ -90,6 +92,7 @@ void Window::create() return; } + glEnable(GL_MULTISAMPLE); glEnable(GL_DEBUG_OUTPUT); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glEnable(GL_DEPTH_TEST); @@ -107,7 +110,9 @@ void Window::create() Font::init(); UI::init(); - Shader::init_program(); + Shader::BLUR.load("../assets/shader", "blur.vsh", "blur.fsh"); + Shader::MAIN.load("../assets/shader", "main.vsh", "main.fsh"); + glBindFramebuffer(GL_FRAMEBUFFER, 0); Sim::System& sys = *System::active; Mesh m, m2; @@ -180,9 +185,9 @@ void Window::render() glm::vec3 brightness = glm::vec3(System::active->grid.get_light_intensity()); glm::mat4 mat_projection = glm::perspective(glm::radians(90.0f), Resize::get_aspect(), 0.01f, 20.f); - glUniformMatrix4fv(Shader::gl_projection, 1, false, &mat_projection[0][0]); - glUniformMatrix4fv(Shader::gl_camera, 1, false, &mat_camera[0][0]); - glUniform3fv(Shader::gl_brightness, 1, &brightness[0]); + glUniformMatrix4fv(Shader::MAIN["projection"], 1, false, &mat_projection[0][0]); + glUniformMatrix4fv(Shader::MAIN["camera"], 1, false, &mat_camera[0][0]); + glUniform3fv(Shader::MAIN["brightness"], 1, &brightness[0]); projection_matrix = mat_projection; glClearColor(0, 0, 0, 1.0f); @@ -192,14 +197,14 @@ void Window::render() render_scene(); mat_camera = Camera::get_matrix(); - glUniformMatrix4fv(Shader::gl_camera, 1, false, &mat_camera[0][0]); + glUniformMatrix4fv(Shader::MAIN["camera"], 1, false, &mat_camera[0][0]); glClear(GL_DEPTH_BUFFER_BIT); glFrontFace(GL_CCW); render_scene(); brightness = glm::vec3(1); - glUniform3fv(Shader::gl_brightness, 1, &brightness[0]); + glUniform3fv(Shader::MAIN["brightness"], 1, &brightness[0]); UI::render(); Focus::render_ui();