Add Image rendering support for ImGui

- Fix alpha channel bug being set to 0
This commit is contained in:
Thraix
2023-07-13 21:17:42 +02:00
parent cb120ef731
commit f9fb74ba6a
7 changed files with 83 additions and 34 deletions
+1 -1
View File
@@ -8,5 +8,5 @@ layout(location = 0) out vec4 outColor;
void main()
{
outColor = vec4(texture(texSampler, inTexCoord).rgb, 1.0);
outColor = texture(texSampler, inTexCoord);
}
+1 -1
View File
@@ -12,5 +12,5 @@ layout(location = 0) out vec4 outColor;
void main()
{
float scale = 0.45 + max(dot(vec3(0, 1, 0), normalize(inLightPos - inPosition)), 0.0);
outColor = vec4(inColor, 1.0) * texture(texSampler, inTexCoord) * scale;
outColor = vec4(inColor * texture(texSampler, inTexCoord).rgb * scale, 1.0);
}
+7 -1
View File
@@ -93,6 +93,7 @@ namespace Copium
const WindowResizeEvent& windowResizeEvent = static_cast<const WindowResizeEvent&>(event);
AssetManager::GetAsset<Framebuffer>(framebuffer).Resize(windowResizeEvent.GetWidth(), windowResizeEvent.GetHeight());
descriptorSetPassthrough->SetSampler(AssetManager::GetAsset<Framebuffer>(framebuffer).GetColorAttachment(), 0);
descriptorSetImGui->SetSampler(AssetManager::GetAsset<Framebuffer>(framebuffer).GetColorAttachment(), 0);
return EventResult::Continue;
}
@@ -146,6 +147,9 @@ namespace Copium
descriptorSetPassthrough = AssetManager::GetAsset<Pipeline>(graphicsPipelinePassthrough).CreateDescriptorSet(*descriptorPool, 0);
descriptorSetPassthrough->SetSampler(AssetManager::GetAsset<Framebuffer>(framebuffer).GetColorAttachment(), 0);
descriptorSetImGui = Vulkan::GetImGuiInstance().CreateDescriptorSet();
descriptorSetImGui->SetSampler(AssetManager::GetAsset<Framebuffer>(framebuffer).GetColorAttachment(), 0);
}
void Application::InitializeGraphicsPipeline()
@@ -168,8 +172,10 @@ namespace Copium
void Application::RecordCommandBuffer()
{
Vulkan::GetImGuiInstance().Begin();
ImGui::ShowDemoWindow();
commandBuffer->Begin();
ImGui::Begin("Viewport");
ImGui::Image(*descriptorSetImGui, ImVec2{480, 270}, ImVec2{0, 1}, ImVec2{1, 0});
ImGui::End();
Framebuffer& fb = AssetManager::GetAsset<Framebuffer>(framebuffer);
Pipeline& pl = AssetManager::GetAsset<Pipeline>(graphicsPipeline);
@@ -25,6 +25,7 @@ namespace Copium
std::unique_ptr<DescriptorPool> descriptorPool;
std::unique_ptr<DescriptorSet> descriptorSet;
std::unique_ptr<DescriptorSet> descriptorSetPassthrough;
std::unique_ptr<DescriptorSet> descriptorSetImGui;
std::unique_ptr<Scene> scene;
std::unique_ptr<Mesh> mesh;
std::unique_ptr<Mesh> meshPassthrough;
+64 -30
View File
@@ -12,40 +12,13 @@ namespace Copium
ImGuiInstance::ImGuiInstance()
: descriptorPool{std::make_unique<DescriptorPool>()}
{
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
// Setup Dear ImGui style
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForVulkan(Vulkan::GetWindow().GetWindow(), true);
ImGui_ImplVulkan_InitInfo init_info = {};
init_info.Instance = Vulkan::GetInstance();
init_info.PhysicalDevice = Vulkan::GetDevice().GetPhysicalDevice();
init_info.Device = Vulkan::GetDevice();
init_info.QueueFamily = Vulkan::GetDevice().GetGraphicsQueueFamily();
init_info.Queue = Vulkan::GetDevice().GetGraphicsQueue();
init_info.PipelineCache = VK_NULL_HANDLE;
init_info.DescriptorPool = *descriptorPool.get();
init_info.Subpass = 0;
init_info.MinImageCount = SwapChain::MAX_FRAMES_IN_FLIGHT;
init_info.ImageCount = Vulkan::GetSwapChain().GetImageCount();
init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT;
init_info.Allocator = nullptr;
init_info.CheckVkResultFn = CheckVkResult;
ImGui_ImplVulkan_Init(&init_info, Vulkan::GetSwapChain().GetRenderPass());
{
CommandBufferScoped commandBuffer;
ImGui_ImplVulkan_CreateFontsTexture(commandBuffer);
}
ImGui_ImplVulkan_DestroyFontUploadObjects();
InitializeImGui();
InitializeDescriptorSetLayout();
}
ImGuiInstance::~ImGuiInstance()
{
vkDestroyDescriptorSetLayout(Vulkan::GetDevice(), descriptorSetLayout, nullptr);
ImGui_ImplVulkan_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
@@ -70,6 +43,67 @@ namespace Copium
ImGui_ImplVulkan_RenderDrawData(draw_data, commandBuffer);
}
std::unique_ptr<DescriptorSet> ImGuiInstance::CreateDescriptorSet()
{
return std::make_unique<DescriptorSet>(*descriptorPool, descriptorSetLayout, shaderBindings);
}
void ImGuiInstance::InitializeImGui()
{
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
ImGui::StyleColorsDark();
ImGui_ImplGlfw_InitForVulkan(Vulkan::GetWindow().GetWindow(), true);
ImGui_ImplVulkan_InitInfo initInfo = {};
initInfo.Instance = Vulkan::GetInstance();
initInfo.PhysicalDevice = Vulkan::GetDevice().GetPhysicalDevice();
initInfo.Device = Vulkan::GetDevice();
initInfo.QueueFamily = Vulkan::GetDevice().GetGraphicsQueueFamily();
initInfo.Queue = Vulkan::GetDevice().GetGraphicsQueue();
initInfo.PipelineCache = VK_NULL_HANDLE;
initInfo.DescriptorPool = *descriptorPool.get();
initInfo.Subpass = 0;
initInfo.MinImageCount = SwapChain::MAX_FRAMES_IN_FLIGHT;
initInfo.ImageCount = Vulkan::GetSwapChain().GetImageCount();
initInfo.MSAASamples = VK_SAMPLE_COUNT_1_BIT;
initInfo.Allocator = nullptr;
initInfo.CheckVkResultFn = CheckVkResult;
ImGui_ImplVulkan_Init(&initInfo, Vulkan::GetSwapChain().GetRenderPass());
{
CommandBufferScoped commandBuffer;
ImGui_ImplVulkan_CreateFontsTexture(commandBuffer);
}
ImGui_ImplVulkan_DestroyFontUploadObjects();
}
void ImGuiInstance::InitializeDescriptorSetLayout()
{
std::vector<VkDescriptorSetLayoutBinding> layoutBindings{1};
layoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
layoutBindings[0].descriptorCount = 1;
layoutBindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
VkDescriptorSetLayoutCreateInfo createInfo{};
createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
createInfo.bindingCount = 1;
createInfo.pBindings = layoutBindings.data();
CP_VK_ASSERT(vkCreateDescriptorSetLayout(Vulkan::GetDevice(), &createInfo, nullptr, &descriptorSetLayout), "Failed to create ImGui DescriptorSetLayout");
ShaderBinding binding;
binding.name = "texture";
binding.set = 0;
binding.binding = 0;
binding.arraySize = 1;
binding.bindingType = BindingType::Sampler2D;
binding.shaderType = ShaderType::Fragment;
shaderBindings = {binding};
}
void ImGuiInstance::CheckVkResult(VkResult err)
{
CP_VK_ASSERT(err, "Failed to initialize ImGui");
@@ -4,6 +4,7 @@
#include "copium/buffer/CommandBuffer.h"
#include "copium/pipeline/DescriptorPool.h"
#include "copium/pipeline/DescriptorSet.h"
namespace Copium
{
@@ -13,6 +14,8 @@ namespace Copium
private:
std::unique_ptr<DescriptorPool> descriptorPool;
VkDescriptorSetLayout descriptorSetLayout;
std::set<ShaderBinding> shaderBindings;
public:
ImGuiInstance();
@@ -22,7 +25,12 @@ namespace Copium
void End();
void Render(CommandBuffer& commandBuffer);
std::unique_ptr<DescriptorSet> CreateDescriptorSet();
private:
void InitializeImGui();
void InitializeDescriptorSetLayout();
static void CheckVkResult(VkResult err);
};
}
@@ -216,7 +216,7 @@ namespace Copium
colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;
VkPipelineColorBlendStateCreateInfo colorBlendCreateInfo{};