From 4029dcd50c0221c7dd7c736472ea8785414e6226 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 21 Feb 2022 00:42:18 +0100 Subject: [PATCH] add builtin shaders --- framework/opengl_renderer/CMakeLists.txt | 3 + .../src/mm/opengl/res/shaders_builtin.cpp | 90 +++++++++++++++++++ .../src/mm/opengl/res/shaders_builtin.hpp | 12 +++ .../src/mm/services/opengl_renderer.cpp | 7 +- framework/opengl_renderer/test/CMakeLists.txt | 11 +++ framework/opengl_renderer/test/builtins.cpp | 59 ++++++++++++ 6 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.cpp create mode 100644 framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.hpp create mode 100644 framework/opengl_renderer/test/builtins.cpp diff --git a/framework/opengl_renderer/CMakeLists.txt b/framework/opengl_renderer/CMakeLists.txt index fd46a64..26c76b0 100644 --- a/framework/opengl_renderer/CMakeLists.txt +++ b/framework/opengl_renderer/CMakeLists.txt @@ -9,6 +9,9 @@ add_library(opengl_renderer_s src/mm/opengl/camera_3d.hpp src/mm/opengl/camera_3d.cpp + + src/mm/opengl/res/shaders_builtin.hpp + src/mm/opengl/res/shaders_builtin.cpp ) target_include_directories(opengl_renderer_s PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src") diff --git a/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.cpp b/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.cpp new file mode 100644 index 0000000..60e4d0c --- /dev/null +++ b/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.cpp @@ -0,0 +1,90 @@ +#include "./shaders_builtin.hpp" + +#include + +namespace MM::OpenGL { + +void load_builtin_shaders_fs(void) { + + // ==================== sampling.glsl ==================== START + FS_CONST_MOUNT_FILE("/shaders/builtin/sampling.glsl", +R"( +#ifndef INCLUDE_BUILTIN_SAMPLING +#define INCLUDE_BUILTIN_SAMPLING + +// kernel defined 9tap sampling +// samper, uv, 1.0/textureSize(), kernel, sum of kernel +vec3 sampling2D_kernel3x3_vec3(in sampler2D tex, in vec2 pos, in vec2 dir_step, in mat3x3 kernel, in float kernel_weight) { + vec3 color = + // upper row + texture(tex, pos + dir_step * vec2(-1.0, 1.0)).rgb * kernel[0][0] + + texture(tex, pos + dir_step * vec2(0.0, 1.0)).rgb * kernel[0][1] + + texture(tex, pos + dir_step * vec2(1.0, 1.0)).rgb * kernel[0][2] + + // middle row + + texture(tex, pos + dir_step * vec2(-1.0, 0.0)).rgb * kernel[1][0] + + texture(tex, pos).rgb * kernel[1][1] + + texture(tex, pos + dir_step * vec2(1.0, 0.0)).rgb * kernel[1][2] + + // lower row + + texture(tex, pos + dir_step * vec2(-1.0, -1.0)).rgb * kernel[2][0] + + texture(tex, pos + dir_step * vec2(0.0, -1.0)).rgb * kernel[2][1] + + texture(tex, pos + dir_step * vec2(1.0, -1.0)).rgb * kernel[2][2] + ; + + return color / vec3(kernel_weight); +} + +// 3x3 9tap tent filter +// 1 2 1 +// 2 4 2 +// 1 2 1 +vec3 sampling2D_tent3x3_vec3(in sampler2D tex, in vec2 pos, in vec2 dir_step) { + const mat3x3 tent_kernel = mat3x3( + vec3(1.0, 2.0, 1.0), + vec3(2.0, 4.0, 2.0), + vec3(1.0, 2.0, 1.0) + ); + const float tent_kernel_weight = 16.0; + + return sampling2D_kernel3x3_vec3( + tex, + pos, + dir_step, + tent_kernel, + tent_kernel_weight + ); +} + +#endif +)") + // ==================== sampling.glsl ==================== END + + // ==================== tonemapping.glsl ==================== START + FS_CONST_MOUNT_FILE("/shaders/builtin/tonemapping.glsl", +R"( +#ifndef INCLUDE_BUILTIN_TONEMAPPING +#define INCLUDE_BUILTIN_TONEMAPPING + +// https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/ +vec3 tonemapACESFilm(vec3 x) { + const float a = 2.51; + const float b = 0.03; + const float c = 2.43; + const float d = 0.59; + const float e = 0.14; + + return clamp((x*(a*x+b))/(x*(c*x+d)+e), vec3(0.0), vec3(1.0)); +} + +vec3 tonemapReinhard(vec3 x) { + return x / (x + vec3(1.0)); +} + +#endif +)") + // ==================== tonemapping.glsl ==================== END +} + +} // MM::OpenGL + diff --git a/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.hpp b/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.hpp new file mode 100644 index 0000000..6d20d3f --- /dev/null +++ b/framework/opengl_renderer/src/mm/opengl/res/shaders_builtin.hpp @@ -0,0 +1,12 @@ +#pragma once + +namespace MM::OpenGL { + +// loads glsl files into const fs at "/shaders/builtin/" +// file list: +// - sampling.glsl +// - tonemapping.glsl +void load_builtin_shaders_fs(void); + +} // MM::OpenGL + diff --git a/framework/opengl_renderer/src/mm/services/opengl_renderer.cpp b/framework/opengl_renderer/src/mm/services/opengl_renderer.cpp index 43b4167..e5ba5cf 100644 --- a/framework/opengl_renderer/src/mm/services/opengl_renderer.cpp +++ b/framework/opengl_renderer/src/mm/services/opengl_renderer.cpp @@ -10,6 +10,7 @@ #include #include "../opengl/res/default_texture.h" // data #include "../opengl/res/errig_texture.h" // data +#include "../opengl/res/shaders_builtin.hpp" // data-ish #include #ifndef MM_OPENGL_3_GLES @@ -111,7 +112,7 @@ bool OpenGLRenderer::enable(Engine& engine, std::vector::ref(); if (!rm_t.contains("default"_hs)) { if (!rm_t.load("default", default_png, default_png_len)) { @@ -125,6 +126,10 @@ bool OpenGLRenderer::enable(Engine& engine, std::vector + +#include +#include +#include +#include + +//#include + +#include +#include + +#include // include only works on files rn + +static const char* argv0 = ""; + +TEST(builtins, all) { + MM::Engine engine; + + engine.addService(argv0); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); + + engine.addService(); + ASSERT_TRUE(engine.enableService()); // adds builtins + + engine.update(); + + FS_CONST_MOUNT_FILE("/shaders/test_frag.glsl", +GLSL_VERSION_STRING +R"( +#ifdef GL_ES + precision mediump float; +#endif + +#include "/shaders/builtin/sampling.glsl" +#include "/shaders/builtin/tonemapping.glsl" + +void main() { +} +)"); + + auto sb = MM::OpenGL::ShaderBuilder::start(); + sb.addStageVertex("void main() {}"); + sb.addStageFragmentF(engine, "/shaders/test_frag.glsl"); + auto shader = sb.finish(); + ASSERT_TRUE(shader); +} + +int main(int argc, char** argv) { + argv0 = argv[0]; + + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} +