diff --git a/vulkan/Application.cpp b/vulkan/Application.cpp index 008d201..b8ed56e 100644 --- a/vulkan/Application.cpp +++ b/vulkan/Application.cpp @@ -26,12 +26,6 @@ void Application::initWindow() #endif } -void Application::run() -{ - initVulkan(); - mainLoop(); - cleanup(); -} #ifdef _WIN32 #else @@ -580,8 +574,7 @@ void Application::cleanup() { DestroyDebugUtilsMessengerEXT(instance, debugMessenger, nullptr); } - - // 等待设备空闲,确保所有命令都完成 + vkDeviceWaitIdle(device); // 正确销毁所有同步对象 @@ -591,44 +584,25 @@ void Application::cleanup() { vkDestroyFence(device, inFlightFences[i], nullptr); } - // 不需要手动释放commandBuffers,销毁命令池时会自动释放 - // 销毁命令池 - vkDestroyCommandPool(device, commandPool, nullptr); - // 销毁图形管线 + vkDestroyPipeline(device, graphicsPipeline, nullptr); - // 销毁管线布局 vkDestroyPipelineLayout(device, pipelineLayout, nullptr); - // 销毁渲染流程 vkDestroyRenderPass(device, renderPass, nullptr); - - // 销毁图像视图 for (auto imageView : swapChainImageViews) { vkDestroyImageView(device, imageView, nullptr); } - // 销毁交换链 vkDestroySwapchainKHR(device, swapChain, nullptr); - // 销毁命令池 - vkDestroyCommandPool(device, commandPool, nullptr); - - // 销毁逻辑设备 vkDestroyDevice(device, nullptr); - - // 销毁窗口表面 vkDestroySurfaceKHR(instance, surface, nullptr); - - // 销毁 Vulkan 实例 vkDestroyInstance(instance, nullptr); #ifdef _WIN32 - // 销毁 GLFW 窗口 glfwDestroyWindow(window); - - // 终止 GLFW glfwTerminate(); #endif } diff --git a/vulkan/Application.h b/vulkan/Application.h index ccb3a73..568c975 100644 --- a/vulkan/Application.h +++ b/vulkan/Application.h @@ -21,13 +21,12 @@ struct Texture class Application : public AppBase { public: - void run(); virtual void initVulkan(); void initWindow(); void createSurface(); void mainLoop(); - void cleanup(); + virtual void cleanup(); void createImageViews(); void createFramebuffers(); diff --git a/vulkan/FaceApp.cpp b/vulkan/FaceApp.cpp index 91a1efa..306f58a 100644 --- a/vulkan/FaceApp.cpp +++ b/vulkan/FaceApp.cpp @@ -15,6 +15,15 @@ FaceApp::~FaceApp() { } +void ReceiveFacePoint(float* pos, int pointCount, int width, int height) +{ + FaceApp* self = FaceApp::Get(); + if (self != nullptr) + { + FaceApp::Get()->update_face_vertex_buffer(pos, pointCount); + } +} + bool FaceApp::LoadOBJ(const std::string& filename, std::vector& vertices, std::vector& indices) { @@ -468,7 +477,17 @@ void FaceApp::setup_descriptor_set() void FaceApp::render(VkCommandBuffer commandBuffer) { - Application::render(commandBuffer); + //Application::render(commandBuffer); + + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout_bg, 0, 1, &m_descriptor_set_bg, 0, NULL); + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline_bg); + + + vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue); + + vkCmdDraw(commandBuffer, 6, 1, 0, 0); + + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_set, 0, NULL); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline); @@ -504,14 +523,33 @@ void FaceApp::initVulkan() createVmaAllocator(); LoadOBJ("face_picture_3dmax.obj", obj_vertices, obj_indices); loadTexture("demo0.png", tex_demo0); + loadTexture("out.png", tex_bg); createVertexBuffer(); createUniformBuffer(); setup_descriptor_pool(); + setup_descriptor_set_layout(); setup_descriptor_set(); create_face_pipelines(); + + setup_descriptor_set_layout_bg(); + setup_descriptor_set_bg(); + create_pipelines_bg(); + uploadVertexData(); faceAppInited = true; + +#if _WIN32 + std::vector floatArray; + std::string& str = HardCodeData::Get().face_result_point_str; + std::stringstream ss(str); + std::string token; + while (std::getline(ss, token, ',')) { + floatArray.push_back(std::stof(token)); + } + + ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480); +#endif } void FaceApp::update_uniform_buffers() @@ -579,14 +617,7 @@ void FaceApp::uploadVertexData() { copyBuffer(m_stagingBuffer, m_indexBuffer, sizeof(uint32_t) * obj_indices.size()); } -void ReceiveFacePoint(float* pos, int pointCount, int width, int height) -{ - FaceApp* self = FaceApp::Get(); - if (self != nullptr) - { - FaceApp::Get()->update_face_vertex_buffer(pos, pointCount); - } -} + void FaceApp::update_face_vertex_buffer(float* pos, int pointCount) { @@ -675,3 +706,209 @@ void FaceApp::createUniformBuffer() update_uniform_buffers(); } + + +void FaceApp::create_pipelines_bg() +{ + VkPipelineInputAssemblyStateCreateInfo input_assembly_state{}; + input_assembly_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + input_assembly_state.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + input_assembly_state.flags = 0; + input_assembly_state.primitiveRestartEnable = VK_FALSE; + + + VkPipelineRasterizationStateCreateInfo rasterization_state{}; + rasterization_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + rasterization_state.polygonMode = VK_POLYGON_MODE_FILL; + rasterization_state.cullMode = VK_CULL_MODE_NONE; + rasterization_state.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + rasterization_state.flags = 0; + rasterization_state.depthClampEnable = VK_FALSE; + rasterization_state.lineWidth = 1.0f; + + + VkPipelineColorBlendAttachmentState colorBlendAttachment{}; + colorBlendAttachment.blendEnable = VK_FALSE; + colorBlendAttachment.colorWriteMask = 0xf; + + + VkPipelineColorBlendStateCreateInfo colorBlending{}; + colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + + + VkPipelineDepthStencilStateCreateInfo depth_stencil_state = {}; + + depth_stencil_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; + depth_stencil_state.depthTestEnable = VK_FALSE; + depth_stencil_state.depthWriteEnable = VK_FALSE; + depth_stencil_state.depthCompareOp = VK_COMPARE_OP_GREATER; + depth_stencil_state.front = depth_stencil_state.back; + depth_stencil_state.back.compareOp = VK_COMPARE_OP_ALWAYS; + + + VkPipelineViewportStateCreateInfo viewport_state{}; + viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewport_state.viewportCount = 1; + viewport_state.scissorCount = 1; + viewport_state.flags = 0; + + + VkPipelineMultisampleStateCreateInfo multisample_state{}; + multisample_state.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + multisample_state.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + multisample_state.flags = 0; + + + // 视口状态 + VkViewport viewport{}; + viewport.x = 0.0f; + viewport.y = 0.0f; + viewport.width = (float)swapChainExtent.width; + viewport.height = (float)swapChainExtent.height; + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + + VkRect2D scissor{}; + scissor.offset = { 0, 0 }; + scissor.extent = swapChainExtent; + + VkPipelineViewportStateCreateInfo viewportState{}; + viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewportState.viewportCount = 1; + viewportState.pViewports = &viewport; + viewportState.scissorCount = 1; + viewportState.pScissors = &scissor; + + + auto vertShaderCode = readFile("shaders/bg.vert.spv"); + auto fragShaderCode = readFile("shaders/bg.frag.spv"); + + VkShaderModule vertShaderModule = createShaderModule(this->device, vertShaderCode); + VkShaderModule fragShaderModule = createShaderModule(this->device, fragShaderCode); + + VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; + vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + vertShaderStageInfo.module = vertShaderModule; + vertShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; + fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; + fragShaderStageInfo.module = fragShaderModule; + fragShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo shader_stages[] = { vertShaderStageInfo, fragShaderStageInfo }; + + VkPipelineVertexInputStateCreateInfo vertex_input_state{}; + vertex_input_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + + + VkGraphicsPipelineCreateInfo pipeline_create_info{}; + pipeline_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + pipeline_create_info.layout = m_pipelineLayout_bg; + pipeline_create_info.renderPass = renderPass; + pipeline_create_info.flags = 0; + pipeline_create_info.basePipelineIndex = -1; + pipeline_create_info.basePipelineHandle = VK_NULL_HANDLE; + + pipeline_create_info.pVertexInputState = &vertex_input_state; + pipeline_create_info.pInputAssemblyState = &input_assembly_state; + pipeline_create_info.pRasterizationState = &rasterization_state; + pipeline_create_info.pColorBlendState = &colorBlending; //&color_blend_state; + pipeline_create_info.pMultisampleState = &multisample_state; + pipeline_create_info.pViewportState = &viewport_state; + pipeline_create_info.pDepthStencilState = &depth_stencil_state; + //pipeline_create_info.pDynamicState = &dynamic_state; + pipeline_create_info.pViewportState = &viewportState; + pipeline_create_info.stageCount = 2; + pipeline_create_info.pStages = shader_stages; + + VK_CHECK(vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipeline_create_info, nullptr, &m_graphicsPipeline_bg)); +} + +void FaceApp::setup_descriptor_set_layout_bg() +{ + VkDescriptorSetLayoutBinding set_layout_binding{}; + set_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + set_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + set_layout_binding.binding = 0; + set_layout_binding.descriptorCount = 1; + + std::vector set_layout_bindings ={set_layout_binding }; + + VkDescriptorSetLayoutCreateInfo descriptor_layout{}; + descriptor_layout.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + descriptor_layout.pBindings = set_layout_bindings.data(); + descriptor_layout.bindingCount = static_cast(set_layout_bindings.size()); + + + + VK_CHECK(vkCreateDescriptorSetLayout(device, &descriptor_layout, nullptr, &m_descriptorSetLayout_bg)); + + VkPipelineLayoutCreateInfo pipeline_layout_create_info{}; + pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipeline_layout_create_info.setLayoutCount = 1; + pipeline_layout_create_info.pSetLayouts = &m_descriptorSetLayout_bg; + + + VkPushConstantRange pushConstantRange{}; + pushConstantRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; // 只在片段着色器中使用 + pushConstantRange.offset = 0; + pushConstantRange.size = sizeof(float); // 或者 sizeof(PushConstants) + + pipeline_layout_create_info.pushConstantRangeCount = 1; + pipeline_layout_create_info.pPushConstantRanges = &pushConstantRange; + + VK_CHECK(vkCreatePipelineLayout(device, &pipeline_layout_create_info, nullptr, &m_pipelineLayout_bg)); +} + +void FaceApp::setup_descriptor_set_bg() +{ + + VkDescriptorSetAllocateInfo alloc_info{}; + alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + alloc_info.descriptorPool = descriptor_pool; + alloc_info.pSetLayouts = &m_descriptorSetLayout_bg; + alloc_info.descriptorSetCount = 1; + + VK_CHECK(vkAllocateDescriptorSets(device, &alloc_info, &m_descriptor_set_bg)); + + + + VkDescriptorImageInfo image_descriptor; + image_descriptor.imageView = tex_bg.view; + image_descriptor.sampler = tex_bg.sampler; + image_descriptor.imageLayout = tex_bg.image_layout; + + VkWriteDescriptorSet write_descriptor_set{}; + write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write_descriptor_set.dstSet = m_descriptor_set_bg; + write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + write_descriptor_set.dstBinding = 0; + write_descriptor_set.pImageInfo = &image_descriptor; + write_descriptor_set.descriptorCount = 1; + + std::vector write_descriptor_sets = { write_descriptor_set }; + + vkUpdateDescriptorSets(device, static_cast(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL); +} + + +void FaceApp::cleanup() +{ + vkDeviceWaitIdle(device); + vkDestroyCommandPool(device, commandPool, nullptr); + vkDestroyPipeline(device, m_graphicsPipeline, nullptr); + vkDestroyPipelineLayout(device, m_pipelineLayout, nullptr); + //vmaUnmapMemory(allocator, m_stagingBufferAllocation); + //vmaUnmapMemory(allocator, uniform_buffer_allocation); + //vmaDestroyBuffer(allocator, uniform_buffer_vs, uniform_buffer_allocation); + //vmaDestroyBuffer(allocator, m_indexBuffer, m_indexBufferAllocation); + //vmaDestroyBuffer(allocator, m_vertexBuffer, m_vertexBufferAllocation); + //vmaDestroyBuffer(allocator, m_stagingBuffer, m_stagingBufferAllocation); + vkDestroyDescriptorSetLayout(device, m_descriptorSetLayout, nullptr); + Application::cleanup(); +} \ No newline at end of file diff --git a/vulkan/FaceApp.h b/vulkan/FaceApp.h index f48eb4d..d4980dc 100644 --- a/vulkan/FaceApp.h +++ b/vulkan/FaceApp.h @@ -43,7 +43,7 @@ public: void update_face_vertex_buffer(float* pos, int pointCount); virtual bool isInited() { return inited && faceAppInited; } - + virtual void cleanup() override; private: glm::vec3 rotation = glm::vec3(); glm::vec3 camera_pos = glm::vec3(); @@ -101,6 +101,16 @@ private: bool faceAppInited = false; float myFloatValue = 1.5f; + + + Texture tex_bg = {}; + void create_pipelines_bg(); + void setup_descriptor_set_layout_bg(); + void setup_descriptor_set_bg(); + VkPipeline m_graphicsPipeline_bg = VK_NULL_HANDLE; + VkPipelineLayout m_pipelineLayout_bg = VK_NULL_HANDLE; + VkDescriptorSetLayout m_descriptorSetLayout_bg = VK_NULL_HANDLE; + VkDescriptorSet m_descriptor_set_bg = VK_NULL_HANDLE; }; #endif diff --git a/vulkan/main.cpp b/vulkan/main.cpp index 21bc805..4d098bc 100644 --- a/vulkan/main.cpp +++ b/vulkan/main.cpp @@ -5,13 +5,13 @@ int main() { FaceApp app; - + app.initVulkan(); try { - app.run(); + app.mainLoop(); } catch (const std::exception& e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; } - + app.cleanup(); return EXIT_SUCCESS; } \ No newline at end of file