From febb71f2c14ca60e1ed0e59f2c36c123ba51a391 Mon Sep 17 00:00:00 2001 From: Patrick Wuttke Date: Tue, 1 Oct 2024 16:56:28 +0200 Subject: [PATCH] Added simple post-processing. --- IDEAS.md | 4 +- assets/shaders/glsl/post_process.comp | 19 ++ private/sdl_gpu_test/5_input/app.cpp | 6 +- private/sdl_gpu_test/6_ui/app.cpp | 6 +- private/sdl_gpu_test/7_3d_scene/app.cpp | 16 +- private/sdl_gpu_test/7_3d_scene/app.hpp | 2 - private/sdl_gpu_test/8_post_process/app.cpp | 263 ++++++++++++++++++ private/sdl_gpu_test/8_post_process/app.hpp | 52 ++++ private/sdl_gpu_test/SModule | 5 +- private/sdl_gpu_test/application.cpp | 32 +++ private/sdl_gpu_test/application.hpp | 7 + private/sdl_gpu_test/main.cpp | 5 +- .../post_process/post_processor.cpp | 47 ++++ .../post_process/post_processor.hpp | 35 +++ private/sdl_gpu_test/scene/scene_renderer.cpp | 15 +- private/sdl_gpu_test/scene/scene_renderer.hpp | 9 +- private/sdl_gpu_test/sdlpp/gpu.hpp | 186 +++++++++++++ 17 files changed, 672 insertions(+), 37 deletions(-) create mode 100644 assets/shaders/glsl/post_process.comp create mode 100644 private/sdl_gpu_test/8_post_process/app.cpp create mode 100644 private/sdl_gpu_test/8_post_process/app.hpp create mode 100644 private/sdl_gpu_test/post_process/post_processor.cpp create mode 100644 private/sdl_gpu_test/post_process/post_processor.hpp diff --git a/IDEAS.md b/IDEAS.md index f768237..a629ada 100644 --- a/IDEAS.md +++ b/IDEAS.md @@ -1,9 +1,9 @@ more ideas on what to try out -- [ ] post processing +- [x] post processing - [x] UI rendering - [ ] DirectX -- [ ] compute shaders +- [x] compute shaders - [ ] mini game - [ ] ImGui? - [ ] extending SDL_gpu? diff --git a/assets/shaders/glsl/post_process.comp b/assets/shaders/glsl/post_process.comp new file mode 100644 index 0000000..1f105cb --- /dev/null +++ b/assets/shaders/glsl/post_process.comp @@ -0,0 +1,19 @@ +#version 460 + +layout(local_size_x = 16, local_size_y = 16, local_size_x = 1) in; + +layout(set = 0, binding = 0, rgba8) uniform readonly image2D u_sourceImage; +layout(set = 1, binding = 0, rgba8) uniform writeonly image2D u_targetImage; + +float luma(vec4 color) +{ + return dot(color.rgb, vec3(0.299, 0.587, 0.114)); +} + +void main() +{ + const ivec2 uv = ivec2(gl_GlobalInvocationID.xy); + const vec4 pixel = imageLoad(u_sourceImage, uv); + const float lum = luma(pixel); + imageStore(u_targetImage, uv, vec4(lum, lum, lum, 1.0)); +} diff --git a/private/sdl_gpu_test/5_input/app.cpp b/private/sdl_gpu_test/5_input/app.cpp index 8d93a60..6e82aca 100644 --- a/private/sdl_gpu_test/5_input/app.cpp +++ b/private/sdl_gpu_test/5_input/app.cpp @@ -121,11 +121,7 @@ void InputApp::init(const AppInitArgs& args) mSampler.create(mDevice, {}); // open gamepad - const std::vector gamepads = sdlpp::getGamepads(); - if (!gamepads.empty()) - { - mGamepad.open(gamepads[0]); - } + mGamepad = openFirstGamepad(); } void InputApp::update(const AppUpdateArgs& args) diff --git a/private/sdl_gpu_test/6_ui/app.cpp b/private/sdl_gpu_test/6_ui/app.cpp index 23098a0..a3a3848 100644 --- a/private/sdl_gpu_test/6_ui/app.cpp +++ b/private/sdl_gpu_test/6_ui/app.cpp @@ -64,11 +64,7 @@ void UIApp::init(const AppInitArgs& args) mSampler.create(mDevice, {}); // open gamepad - const std::vector gamepads = sdlpp::getGamepads(); - if (!gamepads.empty()) - { - mGamepad.open(gamepads[0]); - } + mGamepad = openFirstGamepad(); // init the UI mWidgetTree.init({.renderer = &mUIRenderer}); diff --git a/private/sdl_gpu_test/7_3d_scene/app.cpp b/private/sdl_gpu_test/7_3d_scene/app.cpp index 7139269..59cf3a4 100644 --- a/private/sdl_gpu_test/7_3d_scene/app.cpp +++ b/private/sdl_gpu_test/7_3d_scene/app.cpp @@ -43,10 +43,7 @@ void ThreeDSceneApp::init(const AppInitArgs& args) // open gamepad const std::vector gamepads = sdlpp::getGamepads(); - if (!gamepads.empty()) - { - mGamepad.open(gamepads[0]); - } + mGamepad = openFirstGamepad(); // init the UI mWidgetTree.init({.renderer = &mUIRenderer}); @@ -57,21 +54,10 @@ void ThreeDSceneApp::init(const AppInitArgs& args) .posY = 100, .textHeight = 20 }); - mButton = mWidgetTree.getRootWidget().emplaceChild