save code

This commit is contained in:
xsl
2025-10-26 00:13:08 +08:00
parent 41a659bd6d
commit b2da84f903
66 changed files with 24834 additions and 78 deletions
+97 -62
View File
@@ -4,6 +4,7 @@
FaceApp* FaceApp::faceIns = nullptr;
FaceApp::FaceApp(/* args */)
@@ -372,11 +373,11 @@ void FaceApp::setup_descriptor_pool()
{
VkDescriptorPoolSize descriptor_pool_size{};
descriptor_pool_size.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
descriptor_pool_size.descriptorCount = 6;
descriptor_pool_size.descriptorCount = 2;
VkDescriptorPoolSize descriptor_pool_image_size{};
descriptor_pool_image_size.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
descriptor_pool_image_size.descriptorCount = 6;
descriptor_pool_image_size.descriptorCount = kMaxTexture + 4;
std::vector<VkDescriptorPoolSize> pool_sizes;
@@ -388,7 +389,7 @@ void FaceApp::setup_descriptor_pool()
descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
descriptor_pool_info.poolSizeCount = pool_sizes.size();
descriptor_pool_info.pPoolSizes = pool_sizes.data();
descriptor_pool_info.maxSets = 6;
descriptor_pool_info.maxSets = kMaxTexture + 4 + 2;
VK_CHECK(vkCreateDescriptorPool(device, &descriptor_pool_info, nullptr, &descriptor_pool));
}
@@ -447,66 +448,71 @@ void FaceApp::setup_descriptor_set_layout()
void FaceApp::setup_descriptor_set()
{
m_descriptor_sets.resize(kMaxTexture);
std::vector<VkDescriptorSetLayout> layouts(kMaxTexture, m_descriptorSetLayout);
VkDescriptorSetAllocateInfo alloc_info{};
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
alloc_info.descriptorPool = descriptor_pool;
alloc_info.pSetLayouts = &m_descriptorSetLayout;
alloc_info.descriptorSetCount = 1;
alloc_info.pSetLayouts = layouts.data();
alloc_info.descriptorSetCount = m_descriptor_sets.size();
VK_CHECK(vkAllocateDescriptorSets(device, &alloc_info, m_descriptor_sets.data()));
VK_CHECK(vkAllocateDescriptorSets(device, &alloc_info, &m_descriptor_set));
VkDescriptorBufferInfo buffer_descriptor{};
buffer_descriptor.buffer = uniform_buffer_vs;
buffer_descriptor.range = VK_WHOLE_SIZE;
buffer_descriptor.offset = 0;
VkDescriptorImageInfo image_descriptor;
image_descriptor.imageView = tex_demo0.view;
image_descriptor.sampler = tex_demo0.sampler;
image_descriptor.imageLayout = tex_demo0.image_layout;
// 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1
VkDescriptorImageInfo image_descriptor1;
image_descriptor1.imageView = tex_demo0_ex.view;
image_descriptor1.sampler = tex_demo0_ex.sampler;
image_descriptor1.imageLayout = tex_demo0_ex.image_layout;
VkWriteDescriptorSet write_descriptor_set_uniform{};
write_descriptor_set_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_uniform.dstSet = m_descriptor_set;
write_descriptor_set_uniform.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
write_descriptor_set_uniform.dstBinding = 0;
write_descriptor_set_uniform.pBufferInfo = &buffer_descriptor;
write_descriptor_set_uniform.descriptorCount = 1;
VkWriteDescriptorSet write_descriptor_set_image{};
write_descriptor_set_image.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_image.dstSet = m_descriptor_set;
write_descriptor_set_image.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
write_descriptor_set_image.dstBinding = 1;
write_descriptor_set_image.pImageInfo = &image_descriptor;
write_descriptor_set_image.descriptorCount = 1;
// 添加第二个纹理的写入描述符
VkWriteDescriptorSet write_descriptor_set_image1{};
write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_image1.dstSet = m_descriptor_set;
write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2
write_descriptor_set_image1.pImageInfo = &image_descriptor1;
write_descriptor_set_image1.descriptorCount = 1;
std::vector<VkWriteDescriptorSet> write_descriptor_sets =
for (int i = 0; i < kMaxTexture; ++i)
{
write_descriptor_set_uniform,
write_descriptor_set_image,
write_descriptor_set_image1, // 添加第二个纹理
};
VkDescriptorBufferInfo buffer_descriptor{};
buffer_descriptor.buffer = uniform_buffer_vs;
buffer_descriptor.range = VK_WHOLE_SIZE;
buffer_descriptor.offset = 0;
vkUpdateDescriptorSets(device, static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
VkDescriptorImageInfo image_descriptor;
image_descriptor.imageView = m_texs[i].view;
image_descriptor.sampler = m_texs[i].sampler;
image_descriptor.imageLayout = m_texs[i].image_layout;
// 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1
VkDescriptorImageInfo image_descriptor1;
image_descriptor1.imageView = m_texs_ex[i].view;
image_descriptor1.sampler = m_texs_ex[i].sampler;
image_descriptor1.imageLayout = m_texs_ex[i].image_layout;
VkWriteDescriptorSet write_descriptor_set_uniform{};
write_descriptor_set_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_uniform.dstSet = m_descriptor_sets[i];
write_descriptor_set_uniform.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
write_descriptor_set_uniform.dstBinding = 0;
write_descriptor_set_uniform.pBufferInfo = &buffer_descriptor;
write_descriptor_set_uniform.descriptorCount = 1;
VkWriteDescriptorSet write_descriptor_set_image{};
write_descriptor_set_image.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_image.dstSet = m_descriptor_sets[i];
write_descriptor_set_image.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
write_descriptor_set_image.dstBinding = 1;
write_descriptor_set_image.pImageInfo = &image_descriptor;
write_descriptor_set_image.descriptorCount = 1;
// 添加第二个纹理的写入描述符
VkWriteDescriptorSet write_descriptor_set_image1{};
write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
write_descriptor_set_image1.dstSet = m_descriptor_sets[i];
write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2
write_descriptor_set_image1.pImageInfo = &image_descriptor1;
write_descriptor_set_image1.descriptorCount = 1;
std::vector<VkWriteDescriptorSet> write_descriptor_sets =
{
write_descriptor_set_uniform,
write_descriptor_set_image,
write_descriptor_set_image1, // 添加第二个纹理
};
vkUpdateDescriptorSets(device, static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
}
}
void FaceApp::render(VkCommandBuffer commandBuffer)
@@ -521,10 +527,10 @@ void FaceApp::render(VkCommandBuffer commandBuffer)
vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue);
vkCmdDraw(commandBuffer, 6, 1, 0, 0);
//vkCmdDraw(commandBuffer, 6, 1, 0, 0);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_set, 0, NULL);
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_sets[_curTexIndex], 0, NULL);
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline);
vkCmdPushConstants(commandBuffer, m_pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue);
@@ -575,8 +581,13 @@ void FaceApp::initVulkan()
Application::initVulkan();
createVmaAllocator();
LoadOBJ("face_picture_3dmax.obj", obj_vertices, obj_indices);
loadTexture("demo0.png", tex_demo0, true);
loadTexture("demo0_ex.png", tex_demo0_ex, true);
m_texs.resize(kMaxTexture);
m_texs_ex.resize(kMaxTexture);
for (int i = 0; i < kMaxTexture; ++i)
{
loadTexture("demo0.png", m_texs[i], true);
loadTexture("demo0_ex.png", m_texs_ex[i], true);
}
loadTexture("out.png", tex_bg, false);
createVertexBuffer();
@@ -604,7 +615,7 @@ void FaceApp::initVulkan()
floatArray.push_back(std::stof(token));
}
ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480);
//ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480);
#endif
}
@@ -972,4 +983,28 @@ void FaceApp::cleanup()
//vmaDestroyBuffer(allocator, m_stagingBuffer, m_stagingBufferAllocation);
vkDestroyDescriptorSetLayout(device, m_descriptorSetLayout, nullptr);
Application::cleanup();
}
void FaceApp::SetInitArg(const char* arg)
{
_initArg = json::parse(arg);
}
void FaceApp::changeMotion(Motion& motion)
{
if (_curMotion.getMotionId() == motion.getMotionId())
{
return;
}
_curMotion = _initArg.motion;
for (int i = 0; i < _curMotion.png_num; ++i)
{
string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type;
string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png";
loadTexture(path_name, m_texs[i], true);
string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png";
loadTexture(path_name, m_texs[i], true);
}
}