From f54f70d9d4e3f7cf2fdc96f3246db67e9b0f64d0 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Mon, 20 Jul 2026 00:13:12 +0200 Subject: [PATCH] Added more shaders, and an ImGui window to choose the shader --- CMake/BuildInfo.cmake | 4 ++ CMakeLists.txt | 1 + src/Engine/engine/engine.h | 120 +++++++++++++++++++++++++++++++++---- 3 files changed, 115 insertions(+), 10 deletions(-) diff --git a/CMake/BuildInfo.cmake b/CMake/BuildInfo.cmake index f8e7f27..cf44bfe 100644 --- a/CMake/BuildInfo.cmake +++ b/CMake/BuildInfo.cmake @@ -50,3 +50,7 @@ if (NOT ENGINE_HASH OR GIT_HASH_ERROR_CODE) endif() string(REGEX REPLACE "^v" "" ENGINE_VERSION "${ENGINE_VERSION}") + +set(ENGINE_VERSION "${ENGINE_VERSION}-${CMAKE_BUILD_TYPE}") + +message(STATUS "Engine Version: ${ENGINE_VERSION}") diff --git a/CMakeLists.txt b/CMakeLists.txt index ff040b7..6bf0029 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,6 +200,7 @@ addBinary ( SHADERS shaders/gradient.comp SHADERS shaders/gradient_color.comp + SHADERS shaders/sky.comp LIBS glfw fmt vk-bootstrap vulkan IMGUI ) diff --git a/src/Engine/engine/engine.h b/src/Engine/engine/engine.h index 060ab5d..419e14c 100644 --- a/src/Engine/engine/engine.h +++ b/src/Engine/engine/engine.h @@ -723,7 +723,6 @@ void Engine::initSyncStructures() { ); }); - #ifdef DEBUG fmt::println("[Engine:Init] Sync structures created !"); #endif @@ -838,22 +837,35 @@ void Engine::initBackgroundPipelines() { ); // Create the actual shader - VkShaderModule computeDrawShader; + VkShaderModule gradientShader; if ( !vkutil::loadShaderModule( "shaders/gradient_color.spv", _device, - &computeDrawShader + &gradientShader ) ) { fmt::println("[Engine:Error] Error when building the compute shader !"); } + // Create the second shader + VkShaderModule skyShader; + if ( + !vkutil::loadShaderModule( + "shaders/sky.spv", + _device, + &skyShader + ) + ) { + fmt::println("[Engine:Error] Error while building the compute shader !"); + } + + // Fist Shader VkPipelineShaderStageCreateInfo stageInfo{ .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, .pNext = nullptr, .stage = VK_SHADER_STAGE_COMPUTE_BIT, - .module = computeDrawShader, + .module = gradientShader, .pName = "main" }; @@ -864,6 +876,15 @@ void Engine::initBackgroundPipelines() { .layout = _gradientPipelineLayout }; + ComputeEffect gradient { + .name = "gradient", + .layout = _gradientPipelineLayout, + .data = { + .data1 = glm::vec4(1, 0, 0, 1), + .data2 = glm::vec4(0, 0, 1, 1) + } + }; + VK_CHECK( vkCreateComputePipelines( _device, @@ -871,18 +892,50 @@ void Engine::initBackgroundPipelines() { 1, &computePipelineCreateInfo, nullptr, - &_gradientPipeline + &gradient.pipeline ); ); + // Change the shader module to create the sky shader + computePipelineCreateInfo.stage.module = skyShader; + + ComputeEffect sky { + .name = "sky", + .layout = _gradientPipelineLayout, + .data = { + .data1 = glm::vec4(0.1, 0.2, 0.4, 0.97) + } + }; + + VK_CHECK( + vkCreateComputePipelines( + _device, + VK_NULL_HANDLE, + 1, + &computePipelineCreateInfo, + nullptr, + &sky.pipeline + ); + ); + + // Add the effects into the array + backgroundEffects.push_back(gradient); + backgroundEffects.push_back(sky); + // Do some cleanup vkDestroyShaderModule( _device, - computeDrawShader, + gradientShader, nullptr ); - _mainDeletionQueue.pushFunction([this]() { + vkDestroyShaderModule( + _device, + skyShader, + nullptr + ); + + _mainDeletionQueue.pushFunction([this, sky, gradient]() { vkDestroyPipelineLayout( _device, _gradientPipelineLayout, @@ -891,10 +944,17 @@ void Engine::initBackgroundPipelines() { vkDestroyPipeline( _device, - _gradientPipeline, + sky.pipeline, + nullptr + ); + + vkDestroyPipeline( + _device, + gradient.pipeline, nullptr ); }); + #ifdef DEBUG fmt::println("[Engine:Init] Compute pipelines initalized !"); #endif @@ -1036,6 +1096,42 @@ void Engine::buildImgui() { // Main ImGui things ImGui::ShowDemoWindow(); + if(ImGui::Begin("background")) { + ComputeEffect& selected = backgroundEffects[currentBackgroundEffect]; + + ImGui::Text( + "Selected effect: %s", + selected.name + ); + + ImGui::SliderInt( + "Effect Index", + ¤tBackgroundEffect, + 0, + backgroundEffects.size() - 1 + ); + + + ImGui::InputFloat4( + "data1", + (float*)& selected.data.data1 + ); + ImGui::InputFloat4( + "data2", + (float*)& selected.data.data2 + ); + ImGui::InputFloat4( + "data3", + (float*)& selected.data.data3 + ); + ImGui::InputFloat4( + "data4", + (float*)& selected.data.data4 + ); + + ImGui::End(); + } + // Finish everything ImGui::Render(); } @@ -1066,10 +1162,12 @@ void Engine::drawBackground( VkImageSubresourceRange clearRange = vkinit::imageSubresourceRange(VK_IMAGE_ASPECT_COLOR_BIT); + ComputeEffect& effect = backgroundEffects[currentBackgroundEffect]; + vkCmdBindPipeline( cmd, VK_PIPELINE_BIND_POINT_COMPUTE, - _gradientPipeline + effect.pipeline ); vkCmdBindDescriptorSets( @@ -1083,9 +1181,11 @@ void Engine::drawBackground( nullptr ); + /* ComputePushConstants pc; pc.data1 = glm::vec4(1, 0, 0, 1); pc.data2 = glm::vec4(0, 0, 1, 1); + */ vkCmdPushConstants( cmd, @@ -1093,7 +1193,7 @@ void Engine::drawBackground( VK_SHADER_STAGE_COMPUTE_BIT, 0, sizeof(ComputePushConstants), - &pc + &effect.data ); vkCmdDispatch(